以下是汇编语言中的代码,用于比较两个数字并打印测试字符以确认它是否正确写入。
DATA SEGMENT
NUM1 DB 50
NUM2 DB 45
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
MOV AL, NUM1
MOV BL, NUM2
CMP AL, BL
JLE TAG
TAG: MOV DL, AL
MOV AH, 02H
MOV DL, 'T'
INT 21H
MOV AX, 4CH
INT 21H
CODE ENDS
END START
我的假设是,CMP会将AL与BL进行比较。如果AL较小,则JLE将为真,并且部分中的代码为“TAG'将被执行。正如您所看到的,AL不小,仍然执行TAG。
答案 0 :(得分:2)
我解决了。
汇编语言。它是自上而下的,无论条件是否满足,都会遇到TAG部分中的代码。简单地添加JMP命令(在TAG部分开始之前)将使其在检查条件后直接进入终止,以确保它给出逻辑上正确的答案。
答案 1 :(得分:1)
当我读到这篇文章时,我有点担心。我希望你知道我的假设是,CMP会将AL与BL进行比较。如果AL 较小,则JLE将为真,并且部分中的代码为“TAG'将被执行。正如您所看到的,AL不是较小,仍然会执行TAG。
JLE
助记符代表跳跃,如果少于OR EQUAL 。如果你只需要决定更小(这似乎是这种情况)那么你最好使用jl
指令(如果更少则跳转)。
然后你的代码遇到了真正的问题(你自己已经解决了这个问题)就是这样的结构:
jcc label
label:
...
标签的代码始终执行,因为
解决此问题的一种简单方法是在标签之前插入无条件跳转,以便在条件不正确的情况下标签处的代码可以跳过:
cmp al, bl
jl label
jmp beyond
label:
mov ah, 02h ;Executed only is AL is smaller than BL
mov dl, 'T'
int 21h
beyond:
...
解决此问题的更简单方法是使用相反的条件跳转绕过 label 处的代码。还不再需要标签本身。
对于jl
,相反的条件跳跃是jge
(如果大于或等于则跳跃)
对于jle
,相反的条件跳转为jg
(如果更大则跳转)
cmp al, bl
jge beyond
mov ah, 02h ;Executed only is AL is smaller than BL
mov dl, 'T'
int 21h
beyond:
...
如果您将数字视为已签名数量,那么使用jl
(如果更少则跳转)和jg
(如果更大则跳转)是正确的方法。
另一方面,如果要将数字视为无符号数量,则需要使用jb
(如果在下面跳转)和ja
(如果在上面跳转)指令。< / p>