[英]Program in 8086 assembly language to compare two numbers
以下是汇编语言中的代码,用于比较两个数字并打印测试字符以确认它是否正确写入。
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。
我解决了
在汇编语言中。 它是自上而下的,无论条件是否满足,都会遇到TAG部分中的代码。 简单地添加JMP命令(在TAG部分开始之前)将使其在检查条件后直接进入终止,以确保它给出逻辑上正确的答案。
我的假设是,CMP会将AL与BL进行比较。 如果AL 较小 ,则JLE将为真,并且将执行“TAG”部分中的代码。 正如您所看到的,AL不小 ,仍然执行TAG。
我读这篇文章时有点担心。 我希望你知道, 如果更少OR EQUAL , JLE
助记符代表跳跃 。 如果你只需要决定更小(这似乎是这种情况)那么你最好使用jl
指令(如果更少则跳转)。
你的代码真正的问题(你已经自己解决了)就是这样的结构:
jcc label
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:
...
解决此问题的一种更简单的方法是使用相反的条件跳转绕过标签处的代码。 标签本身也不再需要了。
对于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
(如果在上面跳转)指令。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.