首页 > 解决方案 > 为什么比较指令不起作用?

问题描述

所以我在 8086 中有一个简单的汇编代码,它将变量值中的与 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段总是被执行。

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

标签: assemblyx86-16

解决方案


lea ax, value
cmp ax, 100d
jae StatementWrong

3条指令,3条全错!

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

mov al, value

或者

mov al, [value]

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

cmp al, 100

属于StatementWrong的消息显示:“值大于 100”。当比较产生 ABOVE OR 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

推荐阅读