windows - 我可以使用寄存器作为循环计数器吗?

标签 windows assembly nasm calling-convention

既然函数的调用约定规定了哪些寄存器被保留,那么寄存器可以用作循环计数器吗?

我一开始以为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/

相关文章:

c++ - 这个从 long in a union 到 char* 和 back 的转换是做什么的?

c++ - 如何使用 Windows API 确定注册表值数据的大小?

visual-studio - 如何在 Visual Studio 2017 的 x86 程序集中使用 printf?

assembly - NASM:循环变成无限循环

c# - 删除windows不想让我删除的文件?

c++ - 编译器错误 C4244 : 'initializing' : conversion from '__int64' to 'int' , 可能丢失数据

c - itoa 实现崩溃?

assembly - 在数据段中输入后直接保存输出

ubuntu - 64 位汇编语言在 ubuntu 上使用 nasm

linux - 了解 NASM 程序集中的递归阶乘函数