我写了一些简单的汇编代码,如下所示:
.global _start
.text
_start:
call _sum
subq $0x8, %rsp
popq %rax
ret
_sum:
ret
为了在"popq"指令后获得%rax的值,
我使用"as"one_answers"ld"命令汇编了该代码。我通过在"_start"处设置断点来启动gdb调试器
结果如下:
B+> │0x400078 <_start> callq 0x400083 <_sum>
│ │0x40007d <_start+5> sub $0x8,%rsp
│ │0x400081 <_start+9> pop %rax
│ │0x400082 <_start+10> retq
│ │0x400083 <_sum> retq
然而在进入pop指令之前,有一条错误消息说
程序接收到信号SIGSEGV,分段故障。无法访问地址0x1 处的内存
(当我把$0x8改成$0x0~$0x7时,一切都成功了。(
在第一阶段,和函数似乎是个问题。因为它只会返回。
那么,在popq指令之后,我如何修改此代码以获得%rax的值?
谢谢。
我认为这个问题可能是重复的,但无论如何,您的代码中有一个问题。
.global _start
.text
_start:
call _sum
subq $0x8, %rsp
popq %rax
ret # <-- return to where?
_sum:
ret
C中的才能返回,因为main
必须_start
最终调用main
,但在这里,您直接编写_start
。如果你放一个ret
,它将毫无用处。
用这个代替ret
。
movl $60, %eax # syscall number for sys_exit
movl $0, %edi # or whatever value you want your process
# to return with from 0 to 255;
# xor %edi, %edi is usually better if you want 0
syscall
如果它仍然崩溃,请留下评论。
BTW,我假设您的平台是Linux(因为AT&T语法..(。不同平台的系统调用可能不同。