PUSHAD POPAD或使用“USES”运算符

时间:2014-03-07 16:08:07

标签: assembly

我是汇编语言的新用户,正在使用kip irvine的书籍汇编语言,他谈到使用PUSHAD AND POPAD将通用寄存器保存在堆栈中。 Irvine说如果你正在编写修改任何寄存器的程序,你需要在调用程序后使用PUSHAD和POPAD来保存和恢复寄存器。

我想知道使用“USES”运算符来保存和恢复您在程序中使用的寄存器(例如,如果您只使用EAX和ECX寄存器),或者您是否应该更好,更正确和有效只需保存并恢复所有寄存器。

2 个答案:

答案 0 :(得分:1)

USES是汇编程序特定的。通常,您希望尽可能避免使用特定于汇编程序的指令,因为它们会降低代码的可移植性。此外,任何不使用汇编程序的人都不知道“使用”的含义。

PUSHADPOPAD持久保存通用寄存器集,通常是保存典型长程序寄存器的好方法。对于使用很少寄存器的简短程序,或者在寄存器内(而不是在堆栈中)传递值的情况,你应该手动推/弹,而不是使用PUSHAD。

答案 1 :(得分:0)

我认为pushad通常应该避免,因为它通常不仅仅是必要的。我没有进行微基准测试,但是当你不使用每个通用寄存器时,我猜它会慢一些。它在x86-64位指令集中也不可用。

USES具体是 masm ,但每个汇编程序通常都有某种形式的宏扩展( nasm yasm 等。 ..)消除了复制粘贴编码的需要。另一个例子是 yasm multipush