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

9jyewag0  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(135)

在我的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设置为03 E8时,cmp ax, bx行后,我的代码跳转到less,好像AX小于BX,而不是!
我所期望的是,当ax小于bx时,在jl命令之后,它会跳转到更少的部分,当ax大于bx时也是如此。
我试着在指令之前和之后执行PUSHF和POPF命令,但没有帮助。我还试着分两步比较ax和bx:首先比较ah和bh,然后比较al和bl,但这也没有帮助。
所以,我卡住了。谷歌这个问题没有带来任何东西,所以我希望你的帮助。

dldeef67

dldeef671#

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

相关问题