2013-03-22 50 views
1

我刚开始学习汇编,刚开始时我被困住了 - 我试图调用一个简单的函数 - 实际上它大部分都是从一本书中复制而来,我不断收到分段错误。也许更有经验的人可能会指出什么是错,此代码:在汇编器中调用函数(AT&T,IA-32)

.code32 
SYSEXIT = 1 
.data 
.text 
.globl _start 
_start: 
     push $28 #just some random argument 
     push $33 
     call myfunc 
     mov $SYSEXIT, %eax 
     #exit code is stored in ebx after calling function 
     int $0x80 
.type myfunc, @function 
myfunc: 
     push %ebp #save old base pointer on a stack 
     movl %esp, %ebp 
     movl 8(%ebp), %ebx #first argument to ebx 
     movl 12(%ebp), %ecx #second argument to ecx 
     addl %ecx, %ebx #add arguments together - store them in ebx 
     movl %ebp, %esp 
     pop %ebp 
     ret 
+1

您可能需要'pushl'作为您的直接参数。否则,汇编器可能会生成一个指令来推送一个字(16位)。 – Michael 2013-03-22 08:52:11

+0

已经尝试'pushl'和其他变化 - 仍然获得seg故障 – 2013-03-22 08:56:34

回答

2

你的函数需要的参数是多头(32位),所以你应该pushl而不是push推动他们。

您还应该确保在函数返回后平衡堆栈。即例如:

pushl $28 
pushl $33 
call myfunc 
addl $8,%esp # "removes" two 32-bit arguments off the stack 
+1

事实上,我忘记了平衡堆栈。我已经尝试过'pushl',但没有任何影响。不幸的是,进行更正仍然会导致分段错误。 – 2013-03-22 09:09:15

+0

我试着检查问题出在哪里 - 评论这些行: 'movl 8(%ebp),%ebx #fb第一个参数' movl 12(%ebp),%ecx #second ecx to ecx '' ADDL%ECX,EBX%论据#将一起 - 它们存储在ebx' 'MOVL%EBP,%esp' 没有给我更多的分段错误 – 2013-03-22 09:10:20

+0

我验证过的代码工作正常在我的机器上我在答案中列出的更改。 – Michael 2013-03-22 09:16:11