Assembly 汇编-jmp和cmp导致无限循环

Assembly 汇编-jmp和cmp导致无限循环,assembly,x86,Assembly,X86,这是我的密码: %包括“io.inc” 第二节数据 var数据库0 var2db0 第节.案文 全球CMAIN 打印: 打印12月1日,var inc字节[var] mov-eax,[var] ret forLoop: 呼叫打印 cmp eax,[var2] 前环路 ret CMAIN: 获得12月1日,var2 呼叫forLoop ret 这使用简单ASM的默认库 当输入5(然后放入var2)时,我希望输出: 012345 但是,当输入5时,我得到的是: 01234567891011...

这是我的密码:

%包括“io.inc”
第二节数据
var数据库0
var2db0
第节.案文
全球CMAIN
打印:
打印12月1日,var
inc字节[var]
mov-eax,[var]
ret
forLoop:
呼叫打印
cmp eax,[var2]
前环路
ret
CMAIN:
获得12月1日,var2
呼叫forLoop
ret
这使用简单ASM的默认库

当输入
5
(然后放入
var2
)时,我希望输出:

012345
但是,当输入
5
时,我得到的是:

01234567891011...127128-127-126...-10123...
在检查这两个数字时,
cmp
jle
似乎不能正常工作,而且
forLoop
从未停止调用本身,这导致
var
连续
inc
ed

当我在
GET\u DEC
语句后放置
PRINT\u DEC 1,var2
,如下所示:

CMAIN:
    GET_DEC 1, var2
    PRINT_DEC 1, var2
    call forLoop
    ret
然后注释掉另一行,根本没有输出

我怎样才能解决这个问题

    mov eax, [var]
eax
是一个32位寄存器,因此此指令将标签
var
中的4个字节复制到
eax
中。同样地

    cmp eax, [var2]
eax
var2
处的4个字节进行比较。这是一个问题,因为
var
var2
每个只存储1个字节

修正:


分别
al
是一个8位寄存器(它是eax中的最低字节),因此通过这种方式,我们可以正确地复制/比较1字节的数量。

PRINT\u DEC
可能是一个由简单ASM库定义的宏,但由于我不知道什么是简单ASM,也没有安装它,所以我也无法说出宏是什么。你能找到并发布宏的代码吗?另外,
打印
返回什么?除非宏隐式地调整
var2
,否则代码可能不会执行您想要的操作,因为
var2
将始终为0。我不熟悉此语法,但不应该
mov eax,[var]
be
mov eax,BYTE[var]
(和
cmp eax,[var2]
be
cmp eax,BYTE[var2]
)?或者可能是
al
而不是
eax
?@CodyGray就是这样。@melpomene很好,解决了问题(将
eax
更改为
al
)。谢谢非常奇怪,@melpomene的建议解决了这个问题(尽管它是正确的)。你原本不应该组装的东西。您应该遇到致命的“操作数不匹配错误”或类似错误。你在用什么汇编程序?它显然有一个bug。
    mov al, [var]
    cmp al, [var2]