TASM 中的 JL 命令在不应该工作的时候工作

问题描述 投票:0回答:1

在我的 TASM 程序中,我需要将双字变量与一组其他双字变量进行比较,这些变量声明如下:

dd_buf dd 0
powers_of_10 dd 3B9ACA00h, 05F5E100h, 00989680h, 000F4240h, 000186A0h, 00002710h, 000003E8h, 00000064h, 0000000Ah

我这样比较这些值:

我知道在这个代码位中我只比较每个变量的前 16 位

mov ax, word ptr dd_buf
mov bx, word ptr powers_of_10[di]
cmp ax, bx
jg greater
jl less
greater:
    mov dx, offset greater_output_hint
    call putstr
    call clrf
    jmp end
less:
    mov dx, offset less_output_hint
    call putstr
    call clrf

但是当我在 Turbo Debugger 中运行这个程序并检查值时,我看到当 ax 寄存器设置为 FFFF 并且 bx 设置为 03E8 时,在

cmp ax, bx
行之后我的代码跳转到
less
,就好像 AX小于 BX,当它不是!

我期待的是,当 ax 小于 bx 时,在 jl 命令后它会跳转到 less 部分,当 ax 大于 bx 时类似。

我尝试在指令前后执行 PUSHF 和 POPF 命令,但没有帮助。我还尝试分两步比较 ax 和 bx:首先比较 ah 和 bh,然后比较 al 和 bl,但这也没有帮助。

所以,我卡住了。谷歌搜索这个问题没有带来任何结果,所以我希望能得到你的帮助。

assembly x86-16 tasm
1个回答
0
投票

认为 当 AX=0FFFFh 时,它在 03E8h 以上,但这实际上取决于你比较的是有符号数还是无符号数。 如果将 0FFFFh 视为无符号数,则为 65535。 但是,如果将 0FFFFh 视为有符号数,则为 -1。 对于符号比较,使用 JG/JL;但对于无符号比较,请使用 JA/JB。

© www.soinside.com 2019 - 2024. All rights reserved.