[英]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 EQUAL , JLE
助記符代表跳躍 。 如果你只需要決定更小(這似乎是這種情況)那么你最好使用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.