簡體   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