mov 0, %eax 上 x86 程序集的段错误

dsc*_*atz 5 x86 assembly gnu-assembler segmentation-fault att

我正在尝试组装一小段 x86 代码。我在 32 位机器上,我编写了以下代码。它应该只是将值添加到 eax 中然后返回。我意识到不会有任何输出。当我编译这个使用

gcc main.S -o main

它编译没有错误。但是当我运行它时会出现段错误(gdb 声称它在第一条 movl 指令上出现段错误)。main.S 中有以下代码。我究竟做错了什么?

.text  
.globl main  
main:  
pushl    %ebp  
movl     %esp, %ebp  
movl 0,  %eax  
addl $3, %eax  
addl $3, %eax  
leave 
ret
Run Code Online (Sandbox Code Playgroud)

Bo *_*son 7

不是你的第一个,而是你的第二个 movl

movl  0,%eax
Run Code Online (Sandbox Code Playgroud)

那是来自具有绝对地址的内存源操作数的负载,0这当然是段错误。

使用mov $0, %eax为MOV,立即到寄存器中。(或专门为零,xor %eax, %eax以更有效地将寄存器清零。)