我正在读这本书从头开始编程,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)指向的值吗?
答案 0 :(得分:3)
我想你想在64位操作系统上构建一个32位程序。你必须告诉汇编器和链接器这个情况:
as --32 -o power.o power.s
ld -m elf_i386 -o power power.o
使用./power
运行它。