【 在 hgoldfish 的大作中提到: 】
: 标 题: Re: DOS 写汇编最烦的地方是调函数保存寄存器吧
: 发信站: 水木社区 (Thu Oct 3 16:45:57 2024), 站内
:
: 今天闲得没事继续想这个寄存器的事情。
:
: 不管 DOS 程序使用寄存器传参还是使用栈。在调用其它函数之前,如果不知道被调用函数是否使用寄存器,那调用者最好先把寄存器保存一下。既然是这样,那完全可以多用 fastcall 寄存器传参啊。
没有看过这方面的历史,我猜还是因为当时的指令集对寄存器的使用不够general,很多指令都只能使用特定的寄存器,你用了寄存器传餐了,后面要用的时候不在你期待的寄存器里怎么办,还得挪到特定的寄存器中,有时还需要把某些寄存器先压栈。。。
:
: 神奇的是为啥当年在 DOS 下 c 语言会选择那个 cdecl 调用约定。难道是只是为了实现 printf() ?
你想说的是vararg吧,用寄存器传参也能实现的,参考现代的调用约定
:
: 那么保存寄存器的时候,用 PUSHA 方便呢?还是一个个 PUSH 比较方便?可惜 PUSHA 是 80186 的指令,8086 不能用。
当然用pusha更方便了,但是不是每一个寄存器都需要保存的,取决于你的函数实际用了多少寄存器吧
:
: 【 在 hgoldfish 的大作中提到: 】
: : 每调一个函数都需要把自己使用到的寄存器保存到栈上,再调用函数。等函数返回后,还得把寄存器一个个从栈上弹出来。
: : 这个开销挺大的,所以听说以前有个技巧是写超大的 main() 函数. 以减少函数的调用开销?
:
: --
: 灭绝人性啊
:
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 110.84.122.*]
--
FROM 73.202.29.*