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

时间:2017-01-08 05:21:14

标签: assembly x86

这是我的代码:

%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...

检查这两个数字似乎cmpjle无法正常工作,而forLoop永远不会停止调用自身,这会导致var持续不断inc

当我在PRINT_DEC 1, var2语句后放置GET_DEC时,如下所示:

CMAIN:
    GET_DEC 1, var2
    PRINT_DEC 1, var2
    call forLoop
    ret

并注释掉另一条PRINT_DEC行,根本没有输出。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

    mov eax, [var]

eax是一个32位寄存器,因此该指令将4个字节从标签var复制到eax。类似地,

    cmp eax, [var2]

eaxvar2处的4个字节进行比较。这是一个问题,因为varvar2每个只存储1个字节。

修正:

    mov al, [var]

    cmp al, [var2]

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