因此,我在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 段。
关于可能导致问题的原因的任何想法?
答案 0 :(得分:3)
lea ax, value cmp ax, 100d jae StatementWrong
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 。