bob*_*uba 14 x86 assembly calling-convention
我在x86程序集中编写一个函数,应该可以从c代码中调用,我想知道在返回调用者之前我必须恢复哪些寄存器.
目前我只恢复esp和ebp,而返回值是eax.
还有其他我应该关注的寄存器,还是我可以留下任何令我高兴的东西?
Nec*_*lis 12
使用Microsoft的32位ABI(cdecl或stdcall其他调用约定)EAX,EDX并且ECX是临时寄存器(call clobbered).其他通用整数寄存器是调用保留的.
EFLAGS中的条件代码被调用破坏.呼叫/返回时需要DF = 0,因此您可以在rep movsb没有cld第一个的情况下使用.x87堆栈在调用时必须为空,或者在不返回FP值的函数返回时为空.(FP返回值进入st0,x87堆栈除此之外是空的.)XMM6和7是调用保留的,其余是调用被破坏的临时寄存器.
在Windows之外,大多数32位调用约定(包括Linux上的i386 System V)都同意这种选择的EAX,EDX和ECX作为call-clobbered,但所有 xmm寄存器都是call-clobbered.
对于Windows 64下,你只需要恢复RBX,RBP,RDI,RSI,R12,R13,R14,和R15.XMM6..15是呼叫保留的.(并且您必须为被调用者保留32个字节的阴影空间,无论是否存在任何不适合寄存器的args.)xmm6..15是调用保留的.
有关详细信息,请参阅https://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention.
其他操作系统使用的x86-64系统V ABI(见图3.4) ,其中呼叫保存完好的整数寄存器RBP,RBX,RSP,R12,R13,R14,和R15.所有XMM/YMM/ZMM寄存器都是call-clobbered.
EFLAGS和x87堆栈与32位约定相同:DF = 0,条件标志被破坏,x87堆栈为空.(x86-64约定在XMM0中返回FP值,因此x87堆栈寄存器在调用/返回时始终需要为空.)
有关官方呼叫约定文档的链接,请参阅https://stackoverflow.com/tags/x86/info
32-bit: EBX, ESI, EDI, EBP
64-bit Windows: RBX, RSI, RDI, RBP, R12-R15, XMM6-XMM15
64-bit Linux,BSD,Mac: RBX, RBP, R12-R15
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅Agner Fog的" 软件优化资源 ".本pdf中描述了调用约定.
| 归档时间: |
|
| 查看次数: |
3573 次 |
| 最近记录: |