繁体   English   中英

x86示例程序中的分段错误

[英]Segmentation fault in x86 example program

我正在读这本书从头开始编程 ,乔纳森巴特利特。 在这个第一次显示函数调用约定的程序中,在输入后运行它时会出现分段错误,就像书中一样。 该函数只从堆栈中取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)指向的值吗?

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

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

./power运行它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM