繁体   English   中英

如何在装配中使用CMP测试段和偏移地址?

[英]How do I use CMP in assembly to test a segment and offset address?

如果我正在查看的当前地址至少为0xFFFF0,我想退出循环。 这是我编写的代码部分,但显然不起作用:

CMP DS:[BX], FFFF0H
JGE LeaveLoop

我对汇编语言很陌生,除了简单的数字比较之外,还没有使用CMP。

这听起来像XY问题,您应该指定最终要实现的目标。

无论如何, FFFF0H是20位地址,如果限制为16位,则不能直接与之比较。 您可以使用两个16位寄存器来计算物理地址,并使用它们进行32位比较。

    MOV AX, DS
    MOV DX, DS
    SHL AX, 4
    SHR DX, 12    ; DX:AX has segment base now
    ADD AX, BX    ; add offset
    ADC DX, 0     ; DX:AX has full address now
    CMP DX, 0Fh   ; high word has to be at least F
    JB  false
    JA  true      ; if it's more we are ok
    CMP AX, FFF0h ; low word has to be at least FFF0h
    JAE true
false:
    ...
true:
    ...
    MOV AX, BX
    MOV DX, DS
    SHR AX, 4    ; doesn't need lowest nibble
    ADD AX,DX    ; add offset
    JC LeaveLoop ; See note!!!
    CMP AX, FFFFh
    JE LeaveLoop
    ...
LeaveLoop:

注意:如果溢出不计算在内,则应删除JC LeaveLoop。

暂无
暂无

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

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