用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 (如果高于则跳转)说明。