我正在開發一個匯編語言程式,它將檢查輸入的數字是否可以被 3 整除,現在我正在努力讓事情正確,但我的代碼正在運行..即使在 div 之后,dx 暫存器的內容似乎總是為零被處決了。。
org 100h
jmp main
msg_prpt: db 'Enter a number (1-9): $'
msg_err: db 0dh, 0ah, 'Number out of range. $'
msg_1: db 0dh, 0ah, 'Number is divisible by 3. $'
msg_2: db 0dh, 0ah, 'Number is not divisible by 3. $'
num: db ?
num1 dw ?
display:
mov ah, 9h ; "display string" function for int 21h
int 21h
ret
dsp_prpt:
mov dx, msg_prpt ; copy contents of msg_prompt to dx
call display
ret
dsp_err:
mov dx, msg_err ; copy contents of msg_err to dx
call display
ret
get_num:
mov ah, 1h ; "character input" function for int 21h (stored in al)
int 21h
mov [num], al ; copy contents of al to space at address [num]
mov num1,num
ret
;checking if the inputted number is divisible by 3
validateDivisibleby3:
mov dx,0
mov ax,num ; copy character to ax for comparison
mov bx,03h
idiv bx
cmp dx,0
je isMultipleof3:
call isNotMultipleof3
ret
convert:
sub al, 30h ; subtract 30h from input to get numeric from ascii
ret
isMultipleof3:
; print the result:
mov dx, msg_2 ; copy contents of msg_prompt to dx
call display
ret
isNotMultipleof3:
; print the result:
mov dx, msg_1 ; copy contents of msg_prompt to dx
call display
ret
exit:
; wait for any key press:
mov ah, 0
int 16h
ret ; return control to operating system.
main:
call dsp_prpt
call get_num
call validateDivisibleby3
call convert
call exit
我將非常感謝您的幫助....
uj5u.com熱心網友回復:
mov dx, msg_prpt
你確定你使用的是emu8086嗎?由于 emu8086 使用 MASM 樣式,因此加載訊息的地址必須是mov dx, OFFSET msg_prptor (但這是一個位元組長)lea dx, msg_prpt。您的程式加載了許多地址,因此這很重要。
我正在努力讓事情變得正確
您的代碼未顯示正確結果的原因:
- 您將輸入從字符轉換為 [1,9] 范圍內的值為時已晚。測驗使用的是 ASCII 碼。
- 您檢查的值取自num變數 using
mov ax, num,但num變數只是一個位元組大小的變數。匯編程式應該抱怨這個,然后emu8086又充滿了怪癖......應該
怎么mov num1,num辦?emu8086 接受這個嗎?無論它做什么都會影響您從地址num加載的單詞。 - 您在那些...Multipleof3代碼中錯誤地參考了相反的訊息。
- 注意
je isMultipleof3:. 即使 emu8086 接受了這個尾隨冒號,我也不相信它會生成正確的代碼。
看到您使用 1 到 9 范圍內的值,使用單詞大小的除法有點矯枉過正。下一個代碼使用位元組大小的除法。我還簡化了分支。
get_num:
mov ah, 01h ; "character input" function for int 21h
int 21h ; -> AL
sub al, 30h ; subtract 30h from input to get numeric from ascii
mov [num], al ; copy contents of al to space at address [num]
ret
validateDivisibleby3:
mov al, [num]
mov ah, 0 ; (*)
mov bl, 3
div bl ; AX / BL --> AL quotient, AH remainder
mov dx, OFFSET msg_1 ; Divisible
test ah, ah ; Is remainder 0 ?
jz display ; Yes
mov dx, OFFSET msg_2 ; Not Divisible
; IN (dx)
display:
mov ah, 09h
int 21h
ret
(*) 使用cbw會減少一個位元組。您可以安全地使用它,因為您知道該值為AL正數。
危險
exit: mov ah, 0 int 16h ret ; return control to operating system.
您不能call 退出ret,然后期望僅通過指令回傳 DOS !該call指令將在堆疊上放置一些回傳地址,它不是將控制權回傳給 DOS 的正確回傳地址。
存在幾種選擇。快速解決方法是將 替換call exit為jmp exit.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/463852.html
