【发布时间】: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