asm X86 - 分段错误?

时间:2017-07-23 18:29:57

标签: linux assembly x86

简介

我跟随" 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位机器上。

*如果我的问题没有达到堆栈溢出标准,请告诉我,以便我可以改进。

1 个答案:

答案 0 :(得分:2)

感谢@Michael Petch发现语法错误。在诸如" addl 8,%esp"我没有把美元符号,这表示一个值,而不是一个内存地址,因为指令是立即寻址的。然而,我把美元符号混为一谈,使其成为一个内存地址。谢谢你的帮助。