这是我的代码:
%include "io.inc"
section .data
var DB 0
var2 DB 0
section .text
global CMAIN
print:
PRINT_DEC 1, var
inc BYTE [var]
mov eax, [var]
ret
forLoop:
call print
cmp eax, [var2]
jle forLoop
ret
CMAIN:
GET_DEC 1, var2
call forLoop
ret
这使用Simple-ASM的默认库。
当输入5
(然后放入var2
)时,我希望输出为:
012345
然而,当给出输入5
时,我得到了这个:
01234567891011...127128-127-126...-10123...
检查这两个数字似乎cmp
和jle
无法正常工作,而forLoop
永远不会停止调用自身,这会导致var
持续不断inc
编
当我在PRINT_DEC 1, var2
语句后放置GET_DEC
时,如下所示:
CMAIN:
GET_DEC 1, var2
PRINT_DEC 1, var2
call forLoop
ret
并注释掉另一条PRINT_DEC
行,根本没有输出。
我该如何解决这个问题?
答案 0 :(得分:1)
mov eax, [var]
eax
是一个32位寄存器,因此该指令将4个字节从标签var
复制到eax
。类似地,
cmp eax, [var2]
将eax
与var2
处的4个字节进行比较。这是一个问题,因为var
和var2
每个只存储1个字节。
修正:
mov al, [var]
和
cmp al, [var2]
分别。 al
是一个8位寄存器(它是eax
的最低字节),因此我们正确地复制/比较1字节数量。