【问题标题】:Calling a function in Assembler (AT&T, IA-32)在汇编程序中调用函数 (AT&T, IA-32)
【发布时间】:2013-03-22 08:47:43
【问题描述】:

我刚开始学习 Assembler,但我一开始就卡住了 - 我试图调用一个简单的函数 - 实际上它主要是从书中复制的,而且我一直遇到分段错误。也许更有经验的人可以指出这段代码有什么问题:

.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

【问题讨论】:

  • 您可能需要pushl 作为您的直接论据。否则,汇编器可能会生成一条指令来推送一个字(16 位)。
  • 已经尝试过pushl 和其他变体 - 仍然出现段错误

标签: function assembly x86 call


【解决方案1】:

您的函数要求参数为 long(32 位),因此您应该使用 pushl 而不是 push 推送它们。

您还应该确保在函数返回后平衡堆栈。 IE。类似:

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

【讨论】:

  • 确实我忘了平衡堆栈。我之前尝试过pushl - 没有任何效果。不幸的是,进行更正仍然会给我带来分段错误。
  • 我试图检查问题出在哪里 - 评论这些行: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 不再给我分段错误
  • 我已经通过我在答案中列出的更改验证了代码在我的机器上正常工作。
  • 谢谢,如果代码没问题,我会尝试检查我的机器/操作系统/编译器是否有问题。
  • 尝试用objdump -d 反汇编二进制文件,看看你是否能发现一些可疑的东西。如果这没有帮助,请在调试器中运行您的程序以查看导致段错误的指令以及此时的寄存器值是什么(如果您还没有堆栈跟踪)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多