我一直在重新学习并编写一些汇编代码,这对初学者来说非常基本。我正在x86_64上运行Ubuntu,但我跟随的教程是在32位x86上完成的。
我已经包含了下面的短装配程序,它可以组装和链接,但在运行时会出现段错误。我打赌我的错误是关于32位和64位指令与内存使用之间的界限的混淆/混淆。例如,我在所有movq
寄存器(我收集的32位寄存器的x86_64版本)上使用r**
指令 - 但可能是错误的。
如果有人能够在这里解释问题,我真的很感激,我觉得如果我更好地了解原因,它将来真的有助于避免这些类型的问题。
.data
Bash:
.asciz "/bin/bash"
Null1:
.int 0
AddrToBash:
.int 0
Null2:
.int 0
.text
.globl _start
_start:
movq $Bash, AddrToBash
movq $59, %rax
movq $Bash, %rbx
movq $AddrToBash, %rcx
movq $Null2, %rdx
syscall
Exit:
movq $60, %rbx
movq $1, %rax
syscall
提前致谢!
答案 0 :(得分:3)
%rsi
,%rdi
,%rdx
。见What are the calling conventions for UNIX & Linux system calls on x86-64。.int 0
太短,在所有三个地方都应该.quad 0
。