x86示例程序中的分段错误

时间:2015-02-01 20:31:38

标签: assembly x86 segmentation-fault ld gas

我正在读这本书从头开始编程,Jonathan Bartlett。在这个第一次显示函数调用约定的程序中,在输入后运行它时会出现分段错误,就像书中一样。该函数只从堆栈中取2个数字,并将第一个数字返回到%eax中的第二个数字。

以下是有问题的节目:

.code32

.section .data

.section .text

.globl _start
_start:

  pushl $3
  pushl $2
  call power
  addl $8, %esp

  pushl %eax

  pushl $2
  pushl $5
  call power
  addl $8, %esp

  popl %ebx

  addl %eax, %ebx

  movl $1, %eax
  int $0x80

.type power, @function
power:
  pushl %ebp
  movl %esp, %ebp
  subl $4, %esp

  movl 8(%ebp),  %ebx
  movl 12(%ebp), %ecx

  movl %ebx, -4(%ebp)

power_loop:
  cmpl $1, %ecx
  je end_power

  movl -4(%ebp), %eax
  imull %ebx, %eax
  movl %eax, -4(%ebp)
  decl %ecx

  jmp power_loop

end_power:
  movl -4(%ebp), %eax
  movl %ebp, %esp
  popl %ebp
  ret

我在edb中加载了程序并逐步执行它,当我到达加载第一个函数参数的指令时出现分段错误。提供错误消息

无法访问地址0x000000003EC56208。

我不应该能够访问函数内的(8 +%ebp)和(12 +%ebp)指向的值吗?

1 个答案:

答案 0 :(得分:3)

我想你想在64位操作系统上构建一个32位程序。你必须告诉汇编器和链接器这个情况:

as --32 -o power.o power.s
ld -m elf_i386 -o power power.o

使用./power运行它。