用8086汇编语言编程比较两个数
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 仍然被执行。
我解决了。
用汇编语言。它进入 top-down 并且无论是否满足条件,都会遇到 TAG 部分中的代码。简单地添加一个 JMP 命令(在 TAG 部分开始之前)将使其在检查条件以确保它给出逻辑上正确的答案后直接进入终止。
My assumption is, CMP will compare AL to BL. If AL is smaller, JLE will be true and the code in the part 'TAG' will be executed. As you can see AL is not smaller, still, TAG is executed.
读到这里我有点担心。我希望你知道 JLE
助记符代表 jump if less OR EQUAL。如果你只需要决定更小的(这似乎是这种情况)那么你最好使用 jl
指令(如果更少则跳转)。
你的代码的真正问题(你已经自己解决了)是这样的结构:
jcc label
label:
...
标签处的代码总是被执行,因为
- 如果条件为真,执行跳转到标签
处的代码
- 如果条件为假,执行 将通过 处的代码 label
解决这个问题的一个简单方法是在 标签 之前插入一个无条件跳转,以便在条件不成立的情况下 [=40] 处的代码=]标签可以跳过:
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 处的代码。也不再需要 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
(大于则跳转)是正确的方式。
另一方面,如果要将数字视为 unsigned 数量,则需要使用 jb
(如果低于则跳转)和 ja
(如果高于则跳转)说明。
以下是我用汇编语言编写的代码,用于比较两个数字并打印一个测试字符以确认它是否写对了。
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 仍然被执行。
我解决了。
用汇编语言。它进入 top-down 并且无论是否满足条件,都会遇到 TAG 部分中的代码。简单地添加一个 JMP 命令(在 TAG 部分开始之前)将使其在检查条件以确保它给出逻辑上正确的答案后直接进入终止。
My assumption is, CMP will compare AL to BL. If AL is smaller, JLE will be true and the code in the part 'TAG' will be executed. As you can see AL is not smaller, still, TAG is executed.
读到这里我有点担心。我希望你知道 JLE
助记符代表 jump if less OR EQUAL。如果你只需要决定更小的(这似乎是这种情况)那么你最好使用 jl
指令(如果更少则跳转)。
你的代码的真正问题(你已经自己解决了)是这样的结构:
jcc label
label:
...
标签处的代码总是被执行,因为
- 如果条件为真,执行跳转到标签 处的代码
- 如果条件为假,执行 将通过 处的代码 label
解决这个问题的一个简单方法是在 标签 之前插入一个无条件跳转,以便在条件不成立的情况下 [=40] 处的代码=]标签可以跳过:
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 处的代码。也不再需要 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
(大于则跳转)是正确的方式。
另一方面,如果要将数字视为 unsigned 数量,则需要使用 jb
(如果低于则跳转)和 ja
(如果高于则跳转)说明。