Assembly 汇编语言MASM中的循环

Assembly 汇编语言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

我试图在程序集中创建一个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
        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
clobbers
eax
,这对于大多数调用约定来说都是正常的。嘿,非常感谢您的解决方案。cmp和test有什么区别?eax和eax不应该总是相等的吗?因此跳到exitNow?@RomanProcházkaJr。
test
指令对其操作数执行位与运算,并相应地设置标志。因为在这种情况下(
testeax,eax
)目标操作数和源操作数是相同的,所以零标志将反映
eax
是否为零。或者,可以编写以下代码:
cmpeax,0
jeexitnow
。但是,此替代方案将额外消耗1个字节的代码。