繁体   English   中英

用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。

我解决了

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

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

我读这篇文章时有点担心。 我希望你知道, 如果更少OR EQUALJLE助记符代表跳跃 如果你只需要决定更小(这似乎是这种情况)那么你最好使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM