5

我正在尝试组装一小段 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
4

1 回答 1

7

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

movl  0,%eax

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

用于mov $0, %eaxmov-immediate 进入寄存器。(或具体为零,xor %eax, %eax以更有效地将寄存器归零。)

于 2011-05-01T13:55:27.667 回答