1
2
状态寄存器不会在函数调用中保留。如果状态寄存器中有重要内容,则需要将其复制到其他位置(通常使用SETcc),但调用约定不需要 要求 调用函数可以做到这一点,就像它不需要调用函数来保存和恢复AX等。如果它们中没有什么重要的内容。 |
2
2
回答第二个问题:
你是指
以及
|
3
0
gcc在其目标平台上使用标准调用约定。听起来您在描述Linux上使用的i386 System V调用约定/ABI和/或一些Windows调用约定。(其中一些函数传递参数的方式不同,但对可以删除的寄存器进行相同的选择)。
您使用的是16位寄存器名,但gcc几乎不支持16位x86。它基本上生成32位代码,然后用
不,调用方只有在其中有任何数据要在整个
IMO,更容易理解的是
在调用和返回时,DF必须为0,所以字符串指令向上。(DF是EFLAGS中的另一位)。上的x87堆栈必须为空
Call clobbered意思是
Call preserved意味着调用者可以假定寄存器值没有更改,无论被调用者是避免触摸该寄存器,还是被调用者保存/还原了该寄存器。(对于ESP,被叫方通常使用
除了极少数情况外,没有人能挽救它
. 来电者
能够
如果需要,可以保存它,但通常只需重新进行比较就更容易、更便宜了(
或者更常见的情况是,条件代码中没有任何有用的数据,只有整数寄存器中的整数值。大多数指令都会写EFLAG,但大多数情况下,您从未读过这些结果。您通常使用
有趣的事实: 64-bit OS X system calls set CF on error, otherwise they clear CF . 没有常见的32位或64位函数调用约定在EFLAGS中返回任何内容;他们只是被击倒了。(对于Linux系统调用,保留EFLAGS/RFLAGS。系统调用通常不破坏任何寄存器(返回值除外),部分原因是这样可以避免内核信息泄漏回用户空间。) |
Dusan · 调用函数时保存状态寄存器 6 年前 |
Bilal · 在C中调用存储Oracle过程# 7 年前 |
LemusThelroy · Python-从其他类中的方法检索值 9 年前 |
vandale · x64程序集中的堆栈对齐 11 年前 |
user2402179 · 对于Windows程序的调用约定,最好声明什么? 11 年前 |