Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何在汇编中使用CMP测试段和偏移地址?_Assembly_X86 - Fatal编程技术网

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

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

如果我正在查看的当前地址至少为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:
    ...

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