深入探索C程序调用汇编函数的奥秘
1. 汇编函数的寄存器保存与基本模板
在汇编函数中,某些寄存器需要被调用函数保存,具体如下表所示:
| 寄存器 | 是否需要保存 |
| ---- | ---- |
| EBX | 是 |
| EDI | 是 |
| ESI | 是 |
| EBP | 是 |
| ESP | 是 |
为了保存这些寄存器,需要在函数代码执行前将它们压入栈中,并在函数准备返回调用程序时将它们从栈中弹出。这通常采用标准的前言和结语格式来完成。
以下是一个被C函数调用的汇编语言函数的基本模板:
.section .text
.type func, @function
func:
pushl %ebp
movl %esp, %ebp
subl $12, %esp
pushl %edi
pushl %esi
pushl %ebx
<function code>
popl %ebx
popl %esi
popl %edi
movl %ebp, %esp
popl %ebp
ret
如果某个函数不改变EBX、ESI或EDI寄存器,可以省略相关的PUSH和POP指令。
前言中的SUBL指令用于为函数内部使用的局部变量在栈上预留空间。例如,上述模板中的 subl $12, %esp 指令在栈上预留了12字节的内存空间,可用于存储三个4字节
超级会员免费看
订阅专栏 解锁全文
3196

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



