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]
bemov eax,BYTE[var]
(和cmp eax,[var2]
becmp eax,BYTE[var2]
)?或者可能是al
而不是eax
?@CodyGray就是这样。@melpomene很好,解决了问题(将eax
更改为al
)。谢谢非常奇怪,@melpomene的建议解决了这个问题(尽管它是正确的)。你原本不应该组装的东西。您应该遇到致命的“操作数不匹配错误”或类似错误。你在用什么汇编程序?它显然有一个bug。
mov al, [var]
cmp al, [var2]