汇编语言函数调用与栈操作详解
1. 栈清理
在使用 C 风格函数调用时,有一个细节需要考虑。在调用函数之前,调用程序会将所有所需的输入值压入栈中。当函数返回时,这些值仍然留在栈上(因为函数在访问它们时并没有将其从栈中弹出)。如果主程序要将栈用于其他操作,很可能需要将旧的输入值从栈中移除,使栈恢复到函数调用之前的状态。
可以使用 POP 指令来完成这个操作,也可以将 ESP 栈指针移回到函数调用前的原始位置。通过 ADD 指令将压入栈中的数据元素的大小加回到 ESP 寄存器,就能实现这一点。
例如,如果将两个 4 字节的整数值压入栈中,然后调用一个函数,就需要将 8 加到 ESP 寄存器中,以清理栈上的数据:
pushl %eax
pushl %ebx
call compute
addl $8, %esp
这样可以确保栈回到主程序其余部分所需的正确位置。
2. 示例程序
下面的 functest3.s 程序展示了如何使用栈将输入值传递给函数,并在函数内部使用局部变量:
# functest3.s - An example of using C style functions
.section .data
precision:
.byte 0x7f, 0x00
.section
超级会员免费看
订阅专栏 解锁全文
4万+

被折叠的 条评论
为什么被折叠?



