除ax之外保存所有通用寄存器

时间:2016-09-15 04:38:35

标签: assembly

除AX寄存器外,在程序中保存所有通用寄存器的更好方法是什么?也许没有USES声明可以做到吗?

InputNumberInAX proc 
    pusha ; except AX

    popa ; except AX
    ret 
endp

2 个答案:

答案 0 :(得分:3)

这些是保存所有通用寄存器但不保存AX寄存器的最明显的变体

  1. 使用个人push / pop(按照pusha / popa说明使用的顺序):

    InputNumberInAX proc 
     push cx dx bx bp si di  ;No need to include the SP register!
     ...
     pop di si bp bx dx cx
     ret 
    endp
    
  2. 使用pusha / popa但替换AX寄存器的最后一个已知值:

    InputNumberInAX proc 
     pusha
     ...
     mov [esp+14], ax  ;AX has the value of your InputNumber
     popa
     ret 
    endp
    
  3. 我自己更喜欢第二种变体,因为它的代码尺寸更小,更易读。

答案 1 :(得分:0)

如果你坚持使用一个奇怪的ABI来保存/恢复除EAX以外的所有寄存器,并且正在使用PUSHA,我假设您正在针对代码大小而不是速度进行优化。

在那种情况下:

InputNumberInAX proc 
    pusha             ; this doesn't clear EAX, you don't *need* to avoid copying it to the stack
    ;; then calculate something
    ;; and store it to [esp+28]
    popa              ; loads EAX with the value we just stored.

    ret 
endp
所有ESP调整后,

POPA pops EAX last。我认为+28排量是正确的;我只是快速地想到了它。

当然,如果这是16位代码,请根据需要调整偏移量。