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

あなたの最初ではなく、あなたの2番目の動き

movl  0,%eax

0これは、もちろんsegfaultsである絶対アドレスを持つメモリソースオペランドからのロードです。

mov $0, %eaxレジスタへのmov-immediateに使用します。(または、特にxor %eax, %eaxゼロの場合、レジスタをより効率的にゼロにするため。)

于 2011-05-01T13:55:27.667 に答える