我在调用一个使用堆栈的函数时遇到问题。程序的输出包含很多垃圾,就像字符串的长度错误一样:
.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
我知道它是函数返回地址驻留在堆栈上的东西,但我不知道如何修复它
答案 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
。