本Professional Assembly Languageの 109 ページから次のサンプル プログラムを実行しようとしています。gcc でコンパイルし、Vmware Player を使用して 64 ビットの Fedora 17 ホスト VM で実行しています。コンパイルするには、行.code32
を一番上に追加する必要がありました。
.code32
.section .data
output:
.asciz "The largest value is %d\n"
values:
.int 105, 235, 61, 315, 134, 221, 53, 145, 117, 5
.section .text
.globl main
main:
nop
movl values, %ebx
movl $1, %edi
loop:
movl values(, %edi, 4), %eax
cmp %ebx, %eax
cmova %eax, %ebx
inc %edi
cmp $10, %edi
jne loop
pushl %ebx
pushl $output
call printf
addl $8, %esp
pushl $0
call exit
実行すると、セグメンテーション違反が発生します。gdb でステップスルーすると、命令で segfault が発生しているようmovl values, %ebx
です。gdb からの出力は次のとおりです。
(gdb) break main
Breakpoint 1 at 0x40052c: file testasm1-32.s, line 10.
(gdb) run
Starting program: /home/auser/dev/lab2/testasm1-32
Breakpoint 1, main () at testasm1-32.s:10
10 nop
(gdb) stepi
11 movl values, %ebx
(gdb) stepi
Program received signal SIGSEGV, Segmentation fault.
main () at testasm1-32.s:11
11 movl values, %ebx
その特定の命令がセグメンテーション違反を引き起こしているのはなぜですか?