【问题标题】:Segmentation fault in x86 example programx86 示例程序中的分段错误
【发布时间】:2015-03-31 19:05:29
【问题描述】:

我正在阅读这本书从头开始编程,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) 所指向的值吗?

【问题讨论】:

  • 您确定堆栈正在为您正确设置吗?您确定它正在为您设置吗?你用什么汇编程序?你如何组装它?你如何链接它?
  • 我只是像书中说的那样使用'as'和'ld'。我怎样才能知道堆栈是如何设置的?

标签: assembly x86 segmentation-fault ld gnu-assembler


【解决方案1】:

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

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

使用./power 运行它。

【讨论】:

  • 成功了,谢谢!我以为 .code32 指令告诉了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 2023-01-01
  • 2012-05-26
  • 1970-01-01
  • 2021-02-06
相关资源
最近更新 更多