我需要在 8086 仿真器中撰寫代碼,用戶在其中輸入 0 到 9。如果值低于 3,“早上好!” 被列印。如果該值大于或等于 4 且小于 6(基本上只有 4 和 5),“下午好!” 被列印。如果值大于或等于 8,“晚安!” 被列印。對于值 3、6 和 7,系統不執行任何操作。但是,就我而言,我也得到了這三個值的輸出。我的代碼有什么問題?
.MODEL SMALL
.STACK 100H
.DATA
STRING1 DB "Enter number:$"
STRING2 DB "Good morning!$"
STRING3 DB "Good afternoon!$"
STRING4 DB "Good night!$"
.CODE
MAIN PROC
MOV AX , @DATA
MOV DS , AX
LEA DX , STRING1
MOV AH , 9
INT 21h
MOV AH , 1
INT 21h
SUB AL , 30h
CMP AL , 3
JL good_morning
CMP AL , 6
JL next_check
CMP AL , 8
JGE good_night
good_morning:
LEA DX , STRING2
MOV AH , 9
INT 21h
JMP exit_label
next_check:
CMP AL , 4
JGE good_afternoon
good_afternoon:
LEA DX , STRING3
MOV AH , 9
INT 21h
JMP exit_label
good_night:
LEA DX , STRING4
MOV AH , 9
INT 21h
JMP exit_label
exit_label:
MOV AX , 4C00H
INT 21h
MAIN ENDP
END MAIN
uj5u.com熱心網友回復:
您的代碼的第一個問題是沒有注釋!匯編很難閱讀并帶有評論;不要讓自己(或以后必須回傳并維護此代碼的人)變得更加困難。撰寫代碼時要約束自己撰寫注釋。沒有人想稍后再回去寫評論。作為獎勵,撰寫注釋將(希望)迫使您在撰寫代碼時仔細思考邏輯。
[我]在我的情況下,我也得到了這三個值 [3、6 和 7] 的輸出。
首先跟蹤代碼的邏輯,單步執行并在腦海中“執行”它。由于大部分輸入處理作業正常,我們可以假設讀取輸入的代碼是正確的,所以我們將在此之后開始:
CMP AL , 3
JL good_morning ; if AL < 3, jump to "good_morning"; otherwise, fall through
CMP AL , 6
JL next_check ; if AL < 6, jump to "next_check"; otherwise, fall through
CMP AL , 8
JGE good_night ; if AL > 8, jump to "good_night"; otherwise, fall through
問問自己:如果輸入值為 3 會發生什么(因為這是您看到不正確輸出的第一個值)?嗯,它去next_check。所以,去看看那個代碼:
next_check:
CMP AL , 4
JGE good_afternoon ; if AL >= 4, jump to "good_afternoon"; otherwise, fall through
good_afternoon:
LEA DX , STRING3
MOV AH , 9
INT 21h
JMP exit_label
哎呀!good_afternoon 無論輸入值是什么,您都會失敗!如果AL大于等于4,則跳轉;否則,你會失敗。但是你遇到的和你跳到的完全一樣,所以你會看到輸入值為 3 的“下午好”的輸出。這是錯誤的。
您可以通過在條件跳轉后添加無條件跳轉來修復它:
next_check:
CMP AL , 4
JGE good_afternoon ; if AL >= 4, jump to "good_afternoon"; otherwise, fall through
JMP exit_label
good_afternoon:
LEA DX , STRING3
MOV AH , 9
INT 21h
JMP exit_label
但這比顛倒比較的邏輯和分支的方向效率低(在我看來,可讀性也低):
next_check:
CMP AL , 4
JL exit_label ; if AL < 4, jump to "exit_label"; otherwise, fall through
good_afternoon:
LEA DX , STRING3
MOV AH , 9
INT 21h
JMP exit_label
基于此技術,您應該能夠通過代碼跟蹤產生無效輸出的其他輸入,并以類似的方式糾正問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/450178.html
上一篇:我被困在匯編中寫一個回圈
