如何解决汇编代码中某些指令的分段错误



我写了一些简单的汇编代码,如下所示:

.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语法..(。不同平台的系统调用可能不同。

最新更新