Assembly 汇编语言MASM中的循环
我试图在程序集中创建一个for循环,以打印出从0到N-1的所有整数。由于某种原因,它会中断并创建一个无限循环。你知道为什么吗?我正在使用visual studio 2013 masmAssembly 汇编语言MASM中的循环,assembly,x86,masm,Assembly,X86,Masm,我试图在程序集中创建一个for循环,以打印出从0到N-1的所有整数。由于某种原因,它会中断并创建一个无限循环。你知道为什么吗?我正在使用visual studio 2013 masm .data x DWORD 0 y DWORD 0 .code main:nop invoke version invoke readInteger add x, eax cmp eax, y
.data
x DWORD 0
y DWORD 0
.code
main:nop
invoke version
invoke readInteger
add x, eax
cmp eax, y
je done
increase:
invoke writeInteger, y
inc y
cmp y, eax
jg increase
done:
invoke writeInteger, x
invoke ExitProcess,0
end main
writeInteger将销毁EAX
的内容,因此您无法在CMPy,EAX
即使纠正了这一点,循环也不会起作用,因为当y变量小于x时,您需要返回增加
因为你从零开始,然后递增,所有涉及的数字都是正数
如果输入为零,则不应显示任何内容,因为输入表示计数
总而言之,这是一个解决方案:
invoke readInteger
test eax, eax
jz exitNow
mov x, eax ;x=[1,2GB-1]
increase:
invoke writeInteger, y
inc y
mov eax, x
cmp y, eax
jne increase
exitNow:
invoke ExitProcess,0
使用VS的调试器单步执行并监视寄存器,然后您就会知道原因。但是可能是
writeInteger
clobberseax
,这对于大多数调用约定来说都是正常的。嘿,非常感谢您的解决方案。cmp和test有什么区别?eax和eax不应该总是相等的吗?因此跳到exitNow?@RomanProcházkaJr。test
指令对其操作数执行位与运算,并相应地设置标志。因为在这种情况下(testeax,eax
)目标操作数和源操作数是相同的,所以零标志将反映eax
是否为零。或者,可以编写以下代码:cmpeax,0
jeexitnow
。但是,此替代方案将额外消耗1个字节的代码。