除AX寄存器外,在程序中保存所有通用寄存器的更好方法是什么?也许没有USES声明可以做到吗?
InputNumberInAX proc
pusha ; except AX
popa ; except AX
ret
endp
答案 0 :(得分:3)
这些是保存所有通用寄存器但不保存AX寄存器的最明显的变体:
使用个人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
使用pusha
/ popa
但替换AX
寄存器的最后一个已知值:
InputNumberInAX proc
pusha
...
mov [esp+14], ax ;AX has the value of your InputNumber
popa
ret
endp
我自己更喜欢第二种变体,因为它的代码尺寸更小,更易读。
答案 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位代码,请根据需要调整偏移量。