既然函数的调用约定规定了哪些寄存器被保留,那么寄存器可以用作循环计数器吗?
我一开始以为ecx
寄存器是作为循环计数器使用的,但是发现我使用的stdcall
函数并没有保留的值>ecx
,我不这么认为。
是否有一个寄存器可以保证(至少通过最常用的调用约定)被保留?
注意:我在使用堆栈变量作为循环计数器时没有问题,我只是想确保这是唯一的方法。
最佳答案
您可以使用任何通用寄存器,有时也可以使用其他寄存器作为循环计数器(当然不是堆栈指针☺)。
要么使用一个手动循环,即替换...
loop label
...与...
dec ebp
jnz label
…无论如何,这更快(因为 AMD(以及后来的英特尔,当他们 catch 时,以 MHz 为单位)人为地减慢了循环
指令,否则 Windows® 和一些 Turbo Pascal 编译的软件会崩溃)。
或者您只需保存中间的计数器:
label:
push ecx
call func
pop ecx
loop label
两者都是标准策略。
关于windows - 我可以使用寄存器作为循环计数器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27755607/