使用8086汇编语言编写程序来比较两个数字。

3
以下是我的汇编语言代码,用于比较两个数字并打印一个测试字符以确认是否正确编写。
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。

JLE是无符号小于或有符号小于跳转吗?它们之间有区别吗? - old_timer
1
我不确定。我意识到的一件事是,也许在这种语言中......它会进入TAG,无论条件是否满足。也许需要一个JMP来确保只有在条件为真时才执行TAG。 - Ansh
2个回答

2

我解决了它。

用汇编语言。它从上往下执行,无论是否满足条件,都会遇到TAG部分的代码。只需在TAG部分开始之前添加JMP命令,就可以在检查条件以确保给出逻辑正确答案后直接跳转到终止。


3
甚至更简单的方法是反转条件并跳过标签块。 - Margaret Bloom
请注意,CPU确实会从CS:PC寄存器中的地址执行下一条指令。它们就像普通的寄存器,只是保存了一些16:16位值,而PC在指令解码后的递增方式上是特殊的,“mov pc,value”由“jmp”执行而不是“mov”,等等……但它们最终只是寄存器。因此,要控制执行路径,必须调整PC值。“Jcc”将根据参数调整PC值,当条件满足时,否则PC将保持不变(在Jcc执行期间已经指向下一条指令)。 - Ped7g

1
我假设CMP将比较AL和BL。如果AL更小,JLE将为true并且将执行“TAG”部分的代码。正如你所看到的,AL不是更小,但TAG仍然被执行。
当我读到这段话时,我有些担心。我希望您知道,“JLE”助记符代表“跳转如果小于或等于”。如果您只需要决定更小(这似乎是情况),那么最好使用“jl”指令(跳转如果小于)。
你的代码实际问题(而你已经自行解决了这个问题)在于以下结构:

...

    jcc 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(跳转到上面)指令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接