为什么比较指令不起作用?

时间:2018-11-01 20:06:25

标签: assembly x86-16

因此,我在8086中有一个简单的汇编代码,将变量 value 中的值与100进行了比较,如果大于,则会打印出:“该值大于100”,如果不是,则显示:“该值不大于100“。

这是代码:

data segment
    string db "The value is larger$"
    value db 80
    right db "The value is greater than 100$"
    wrong db "The value is not greater than 100$"
ends

stack segment
    dw 128 dup(0)
ends

code segment
start:

    mov ax, data
    mov ds, ax
    mov es, ax

    lea ax, value
    cmp ax, 100d
    jae StatementWrong

StatementRight:
    lea dx, right
    jmp Ending

StatementWrong:
    lea dx, wrong

Ending:
    mov ah, 9
    int 21h

    mov ah, 1
    int 21h

    mov ax, 4c00h
    int 21h

ends

但是无论我有什么值(无论它是否大于100),问题始终在执行 StatementRight 段。

关于可能导致问题的原因的任何想法?

2 个答案:

答案 0 :(得分:3)

lea ax, value
cmp ax, 100d
jae StatementWrong

3条指令,全部3条错误!

lea指令加载 value 变量的地址。您需要它的内容。您可以通过以下任一说明获得此信息:

mov al, value

mov al, [value]

由于您的 value 变量被定义为字节,因此您的代码也应将其作为字节进行比较。

cmp al, 100

属于 StatementWrong 的消息显示为:“该值大于100”。当比较产生ABOVE或EQUAL时,为什么又跳到该消息?那是矛盾的。

jng StatementWrong

--------------------------------------------

在上下文中(并且有所改善!):

  mov  al, [value]
  cmp  al, 100
  lea  dx, right    ; "The value is greater than 100$"
  jg   Ending       ; JG means JUMP IF GREATER
  lea  dx, wrong    ; "The value is not greater than 100$"
Ending:
  mov  ah, 09h
  int  21h

答案 1 :(得分:0)

另一个问题是您将值声明为BYTE,但是将WORD加载到AX中。有几种解决方案,但简单的解决方案是;

    cmp     al, 100

value:   dw   100

以这种方式将AX的高位清零,并使用 CMP AX