【发布时间】:2013-12-20 01:06:40
【问题描述】:
我刚刚开始学习 MASM,并且我编写了一个应该运行一个简单循环的示例代码。
mov eax, 1
x: add eax,1
print str$(eax),13,10
cmp eax, 4
jne x
inkey
exit
所以,我希望这个小程序能够打印 2、3、4。然而,我得到的是一个无限循环并不断打印 3。任何线索为什么它没有像我想象的那样工作?
【问题讨论】:
我刚刚开始学习 MASM,并且我编写了一个应该运行一个简单循环的示例代码。
mov eax, 1
x: add eax,1
print str$(eax),13,10
cmp eax, 4
jne x
inkey
exit
所以,我希望这个小程序能够打印 2、3、4。然而,我得到的是一个无限循环并不断打印 3。任何线索为什么它没有像我想象的那样工作?
【问题讨论】:
eax 是一个易失性寄存器,这意味着它的值不需要在函数/宏调用之间保存。您需要在 print 宏之前保存 eax 并在之后恢复它:
mov eax, 0
x:
add eax,1
push eax
print str$(eax),13,10
pop eax
cmp eax, 4
jne x
inkey
exit
或者只是使用一个非易失性寄存器,该寄存器的值需要被调用者保存(esi,edi,ebx)
mov ebx, 1
x:
add ebx,1
print str$(ebx),13,10
cmp ebx, 4
jne x
inkey
exit
【讨论】:
push eax 的第一个会(相当)比不使用堆栈的第二个慢(因此根据我所读到的RAM,访问是昂贵的)?