GNU汇编程序,使用堆栈的函数调用,seg错误

时间:2014-06-05 19:43:01

标签: assembly gnu

我在调用一个使用堆栈的函数时遇到问题。程序的输出包含很多垃圾,就像字符串的长度错误一样:

.code32

.equ kernel, 0x80
.equ stdout, 0x01
.equ write, 0x04
.equ exit, 0x01

.section .data
sum:
    .ascii "text"
.equ lensum, . - sum

.section .text

    .type writetxt, @function
writetxt:
    movl $write, %eax
    movl $stdout, %ebx
    popl %ecx
    pop %edx
    int kernel
    ret

.global _start

_start:
    pushl $lensum
    pushl $sum
    call writetxt

    movl $exit, %eax
    movl $0, %ebx
    int $kernel

我知道它是函数返回地址驻留在堆栈上的东西,但我不知道如何修复它

1 个答案:

答案 0 :(得分:1)

正如您已经注意到的那样,当您输入(%esp)时,返回地址将位于堆栈的顶部(即writetxt)。您在call之前推送的最后一个32位值将位于4(%esp),依此类推。

所以而不是

popl %ecx
popl %edx

你应该使用像

这样的东西
movl 4(%esp), %ecx
movl 8(%esp), %edx

不要忘记之后调整堆栈指针。例如,您可以在addl $8, %esp指令后放置call writetext