如何在汇编中使用CMP来测试段和偏移地址?

时间:2015-07-16 22:30:49

标签: assembly x86

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

CMP DS:[BX], FFFF0H
JGE LeaveLoop

我对组装非常陌生,除了简单的数字比较之外,我还没有使用过CMP。

2 个答案:

答案 0 :(得分:3)

这听起来像一个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:
    ...

答案 1 :(得分:2)

{{1}}

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