IA-32 movl指令导致段错误

时间:2013-05-02 05:32:57

标签: assembly x86

我正在尝试从 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中单步执行它,则会在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

为什么该特定指令会导致段错误?

0 个答案:

没有答案
相关问题