i386 的一些调用约定 (c, borland register, stdcall) 有要求函数保存 EAX, ECX, EDX. 其它的 EBX, ESI, EDI, EBP, ESP 这几个,如果被调用者要用到的话,需要自行保存。
个人感觉 borland register 的调用约定是比较合理的。其它的调用约定简直是丧心病狂也不知是怎么想出来的。既要求调用者保存 EAX, ECX, EDX 又不拿来传参数。这不是浪费宝贵的字节么。
8086 的话,也是 turbo c 比较合理,使用了 AX, DX, BX 进行传参。
【 在 BigCarrot 的大作中提到: 】
: 没有看过这方面的历史,我猜还是因为当时的指令集对寄存器的使用不够general,很多指令都只能使用特定的寄存器,你用了寄存器传餐了,后面要用的时候不在你期待的寄存器里怎么办,还得挪到特定的寄存器中,有时还需要把某些寄存器先压栈。。。
: 你想说的是vararg吧,用寄存器传参也能实现的,参考现代的调用约定
: 当然用pusha更方便了,但是不是每一个寄存器都需要保存的,取决于你的函数实际用了多少寄存器吧
: ...................
--
修改:hgoldfish FROM 110.84.122.*
FROM 110.84.122.*