[英]Intel 8086, infinite loop
我正在嘗試編寫一個小應用程序,其中使用系統時鍾生成1-5之間的隨機數,並且用戶必須猜測該數字,如果猜測正確,則會顯示一條消息。
到目前為止,這是我的代碼:
org 0x100
;Guess:
MOV AH,2CH ;DOS CALL TO GET SYSTEM CLOCK
INT 21H ;EXECUTE INTERRUPT 21H
MOV AL,DL ;RESULT RETURNED IN DL
MOV AH,0 ;CLEAR THE HIGH BYTE
MOV CL,20 ;GET DIVISOR
DIV CL ;DIVIDE VALUE IN AX BY VALUE IN CL
MOV BL,AL ;MOVE RESULT OF DIVISION INTO BL
INC BL ;INCREMENT BL TO GET NO BETWEEN 1-5
;Prompt:
JMP START
MSG DB "Enter a number between 1-5:$"
START:
MOV DX, OFFSET MSG
MOV AH, 09h
INT 21h
;User input:
MOV AH, 1h ;GET INPUT FROM THE KEYBOARD
INT 21h ;THE CHARACTER INPUT IS STORED IN AL
;The Comparison:
;MOV AX,AL ;LOAD VALUE OF AL (USER INPUT)
CMP AL,BL ;COMPARE WITH BL
JE Equal ;IF EQUAL JUMP TO Equal
JNE Not_Equal;IF NOT EQUAL JUMP TO Not_Equal
Equal:
ABC DB "Your guess was correct!$"
MOV DX, OFFSET ABC
MOV AH, 09h
INT 21h
Not_Equal:
DEF DB "Your guess was incorrect!$"
MOV DX, OFFSET DEF
MOV AH, 09h
INT 21h
我的問題是,它只是陷入無限循環。
您的代碼中存在一些其他問題:
您不能這樣混合代碼和數據:
ABC DB "Your guess was correct!$"
MOV DX, OFFSET ABC
CPU無法分辨代碼和數據之間的區別,它將嘗試執行遇到的任何內容。 將結果字符串移到MSG
字符串的位置。
您正在將數值與其對應的ASCII字符進行比較:
MOV AH, 1h ;GET INPUT FROM THE KEYBOARD
INT 21h ;THE CHARACTER INPUT IS STORED IN AL
如果在終端中輸入數字2
,則會在AL
獲得字符'2'
(等於50)。 要成功將其與BL
進行比較,您必須從AL
減去'0'
。
您將始終打印“您的猜測不正確”字符串。 在打印出“您的猜測是正確的”字符串的代碼之后,沒有跳轉可以跳過下一個打印:
ABC DB "Your guess was correct!$"
MOV DX, OFFSET ABC
MOV AH, 09h
INT 21h
; Execution will simply continue here since there's nothing that changes the
; flow of execution.
Not_Equal:
您沒有正確終止程序。 在程序結束時,您應該添加以下內容:
MOV AX,4C00h
INT 21h ; Terminate with exit code 00h
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.