Assembly 如何在汇编中使用CMP测试段和偏移地址?
如果我正在查看的当前地址至少为0xFFFF0,我想留下一个循环。下面是我编写的代码部分,但显然不起作用:Assembly 如何在汇编中使用CMP测试段和偏移地址?,assembly,x86,Assembly,X86,如果我正在查看的当前地址至少为0xFFFF0,我想留下一个循环。下面是我编写的代码部分,但显然不起作用: CMP DS:[BX], FFFF0H JGE LeaveLoop 我对汇编非常陌生,除了简单的数字比较外,我没有使用CMP进行任何操作。这听起来像是一个XY问题,您应该指定最终要实现的目标 无论如何,FFFF0H是一个20位的地址,如果限制为16位,则无法直接与之进行比较。您可以使用两个16位寄存器来计算物理地址,并使用它们进行32位比较 MOV AX, DS MOV D
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:
...
这听起来像是一个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:
...
注意:如果溢出不计算在内,则应删除JC LeaveLoop
注意:如果溢出不计算,那么JC LeaveLoop应该被删除。是的,就像Jester说的,我试图寻址20位。是的,就像Jester说的,我试图寻址20位。你可以忽略BX的最低半字节。@MikkelChristiansen是的,在这个特殊情况下,这是真的。捕捉得好。@Jester高阶部分在冒号之前,比如DX:ax。你可以忽略BX的最低一位。@MikkelChristiansen是的,在这个特殊情况下,这是真的。很好的捕捉。@Jester高阶部分位于冒号之前,类似于DX:AX