简介
我跟随" ProgrammingGroundUp"书。我已经按照创建一个函数来提高两个数字的幂并添加它们的例子。 " 2 ^ 3 + 5 ^ 2"。但是当我去编译代码,然后运行程序。我收到了分段错误。
根据我的理解,当程序试图从内存位置进行非法读取或写入时,会发生分段错误。我认为它可能发生在函数本身内部,但是对于发生分段错误的位置感到困惑。
源代码 - power.s
#purpose illustrate how functions work. Program will compute 2^3 + 5^2
#using registers so nothing in data section
.section .data
.section .text
.globl _start
_start:
pushl $3 #push 2nd arg on stack
pushl $2 #push 1st arg on stack
call power
addl 8,%esp #move stack pointer back
pushl %eax #push result to top of stack
pushl $2 #push 2nd arg on stack
pushl $5 #push 1st arg on stack
call power
addl 8,%esp #move stack pointer back
popl %ebx #put function1 result into ebx reg
addl %eax , %ebx #add return result of function2 + function1 result
movl $1 , %eax #exit system call
int $0x80
#PURPOSE: power function
#REGISTERS: %ebx - holds base number ; %ecx - holds power; -4(%ebp) -holds current result ;%eax temp storage
.type power,@function
power:
pushl %ebp #save state of base pointer
movl %esp,%ebp #make stack pointer the base pointer
subl $4,%esp #room for local storage
movl 8(%ebp),%ebx #1st arg initialized,
movl 12(%ebp),%ecx #2nd arg initialized,
movl %ebx , -4(%ebp) #store current result
power_loop_start:
cmpl $1,%ecx #if ^1 then jump to end_power & exit
je end_power
movl -4(%ebp),%eax #store current result
imull %ebx,%eax #multiply
movl %eax,-4(%ebp) #store result
decl %ecx #decrement ecx
jmp power_loop_start #loop
end_power: #return
movl -4(%ebp) , %eax #move result in eax for return
movl %ebp , %esp #reset the stack pointer
popl %ebp #reset base pointer to original position
ret #return
编译
as --32 power.s -o power.o
ld -m elf_i386 power.o -o power
./power
分段错误
摘要
代码中出现分段错误,不确定在哪里,对于汇编来说非常新,试图尽我所能解释。 BTW使用" - 32"因为代码是32位,我在64位机器上。
*如果我的问题没有达到堆栈溢出标准,请告诉我,以便我可以改进。
答案 0 :(得分:2)
感谢@Michael Petch发现语法错误。在诸如" addl 8,%esp"我没有把美元符号,这表示一个值,而不是一个内存地址,因为指令是立即寻址的。然而,我把美元符号混为一谈,使其成为一个内存地址。谢谢你的帮助。