[英]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.