用8086汇编语言编程来比较两个数字

时间:2017-01-27 03:57:40

标签: assembly conditional x86-16

以下是汇编语言中的代码,用于比较两个数字并打印测试字符以确认它是否正确写入。

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。

2 个答案:

答案 0 :(得分:2)

我解决了。

汇编语言。它是自上而下的,无论条件是否满足,都会遇到TAG部分中的代码。简单地添加JMP命令(在TAG部分开始之前)将使其在检查条件后直接进入终止,以确保它给出逻辑上正确的答案。

答案 1 :(得分:1)

  

我的假设是,CMP会将AL与BL进行比较。如果AL 较小,则JLE将为真,并且部分中的代码为“TAG'将被执行。正如您所看到的,AL不是较小,仍然会执行TAG。

当我读到这篇文章时,我有点担心。我希望你知道JLE助记符代表跳跃,如果少于OR EQUAL 。如果你只需要决定更小(这似乎是这种情况)那么你最好使用jl指令(如果更少则跳转)。

然后你的代码遇到了真正的问题(你自己已经解决了这个问题)就是这样的结构:

    jcc label
label:
    ...

标签的代码始终执行,因为

  • 如果条件为真,执行跳转标签的代码
  • 如果条件为false,则标签
  • 中的代码执行

解决此问题的一种简单方法是在标签之前插入无条件跳转,以便在条件不正确的情况下标签处的代码可以跳过:

    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>