Assembly 为什么要通过寄存器推送变量,而不是在汇编语言中直接推送变量?

Assembly 为什么要通过寄存器推送变量,而不是在汇编语言中直接推送变量?,assembly,masm,masm32,keylogger,Assembly,Masm,Masm32,Keylogger,我在一个论坛上遇到了asm中的一个键盘记录程序。我想我可以自己创建一个键盘记录器。当我阅读代码以了解程序中实际发生的情况时,我遇到了一些有趣的事情 1.程序几乎从未将变量推入堆栈。它将变量的值移动到寄存器,然后按下寄存器。 例如 2.程序使用stosd清除阵列。 例如: 程序使用push-pop来分配值,如上例所示 上述公约的优点是什么 1)我想不出在当前的机器上有什么优势,但在过去,你只能推regs。没有push mem/immed表单 2) 简单/与#1相同。我听说现在的字符串指令几乎被弃用

我在一个论坛上遇到了asm中的一个键盘记录程序。我想我可以自己创建一个键盘记录器。当我阅读代码以了解程序中实际发生的情况时,我遇到了一些有趣的事情

1.程序几乎从未将变量推入堆栈。它将变量的值移动到寄存器,然后按下寄存器。 例如

2.程序使用stosd清除阵列。 例如:

程序使用push-pop来分配值,如上例所示

上述公约的优点是什么

1)我想不出在当前的机器上有什么优势,但在过去,你只能推regs。没有push mem/immed表单

2) 简单/与#1相同。我听说现在的字符串指令几乎被弃用了。然而,早在那一天,它们是唯一的飞行方式,因为它们的速度快得多(循环时间并没有好得多,但通过不强制加载更多指令,节省了当天非常有限的内存带宽)

;hInst:DWORD 4
lea esi, hInst
push esi
    ;array1 BYTE 256 DUP(?)
    lea edi, array1
    push 256/4
    xor eax, eax
    rep stosd 3