繁体   English   中英

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

[英]Assembly - jmp and cmp result in infinite loop

这是我的代码:

%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版。

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

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

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

我怎样才能解决这个问题?

    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 字节数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM