試設計一程式可分辨輸入的字元是否為數字(0~9),並依輸入的數字多寡印出指定的字元,直接按enter時程式結束。
C:\>filename↵
Enter a number: 5
Enter a character: *
*****
Enter a number: 7
Enter a character: G
GGGGGGG
Enter a number: y
Not a number!
Enter a letter: &
Not a number!
Enter a number: ↵
C:\>
-----------------------------------------------------------
以下是我寫的程式
.MODEL SMALL
.STACK 100H
.DATA
MSG1 DB 0DH,0AH,'Enter a number: $'
MSG2 DB 0DH,0AH,'Enter a character: $'
MSG3 DB 0DH,0AH,'Not a number!$'
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
NEXT:
LEA DX,MSG1
MOV AH,9
INT 21H
MOV AH,1
INT 21H
MOV BL,AL
SUB BL,48 ;AL讀到字元10進制值-48轉換成 相對應的數字0~9
MOV CL,BL ;以CL記錄 要重覆顯示的字元次數
CMP AL,0DH ;判斷讀入字元是否為 ENTER 控制字元
JE _DOS
CMP AL,'0' ;判斷讀入字元若非0~9則顯示此非數字之錯誤訊息
JB NLC
CMP AL,'9'
JA NLC
LEA DX,MSG2 ;利用第9號服務程式顯示MSG2字串內容,即顯示 要求輸入字元
MOV AH,9
INT 21H
MOV AH,1 ;利用第1號服務程式 允許在字串之後輸入1字元 並將鍵盤字元回傳到AL
INT 21H
AGAIN:
MOV DL,AL ;利用第2號服務程式 顯示DL資料(因AL資料已送至DL,所以鍵盤字元被印出)
MOV AH,02
INT 21H
DEC CL ;將CL計數次數-1
JNZ AGAIN
JMP NEXT
NLC:
MOV AH,9
LEA DX,MSG3
INT 21H
JMP NEXT
_DOS:MOV AH,4CH ;利用第4CH號服務程式 離開DOS
INT 21H ;DOS exit
MAIN ENDP
END MAIN
; 以CL記錄 要重覆顯示的字元次數
; 檢查讀入字元是否為ENTER鍵(ASCII表 中0DH),是則離開DOS! 否則判斷是否為0 ~ 9
; 是則將讀入字元再次記錄於AL,將AL資料送到DL並利用2號服務程式顯示DL資料。並將CL計數次數-1 來重覆顯示該字元次數
--------------------------------------------------------------------------
請大大RUN過一次我的程式幫忙修改一下,我的程式一開始輸入數字 ,接著輸入字元,而輸入字元後並沒跳下一行就直接重覆印出。
我有試過
MOV AH,1
INT 21H
在這行之後加入
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
來讓自已輸入完字元後會跳下行然後想要重覆印出!
但加入這行換行指令後 卻不知為何改變了AL的值 ,使得重覆印出的資料變成錯誤了,我知可以先將AL值先複製到BL借放 這樣就不怕加入換行指令後AL被改變,這樣程式的確也行!
但這樣寫程式觀念一定不熟悉,所以想請大大幫我修改正確的方法 並麻煩告訴我 為何我加換行指令 AL值會被改變?? 這點務必告訴我 拜託^^
2007-10-13 19:46:51 · 3 個解答 · 發問者 eric 7 in 電腦與網際網路 ➔ 程式設計
麻煩你也寄修改我程式部份的 程式唷 謝謝^^
2007-10-15 02:59:03 · update #1
先寫自己的,再寄修改的.MODEL SMALL
.stack 100h
.data
str1 db 0dh,0ah,'Enter a number: $'
str2 db 0dh,0ah,'Enter a character: $'
str3 db 0dh,0ah,'Not a number!$'
.code
main proc far
mov ax,@data
mov ds,ax
main2:
mov ah,9
lea dx,str1
int 21h ;display str1
call gkeyn
mov cl,al ;store N
jnc main3
cmp al,0dh
jz mainz
call disperr
main3:
mov ah,9
lea dx,str2
int 21h ;display str2
mov ah,1
int 21h ;get input al
cmp al,0dh ;if enter
jz mainz
mov bl,al ;stoe character
mov ch,0 ;clear high byte
or cl,cl
jnz main4 ;if 0-9
call disperr
jmp main2
main4:
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
main5:
mov dl,bl
mov ah,2
int 21h
loop main5
jmp main2
mainz:
mov ah,4ch
int 21h
;get key,output carry,al
;al=0dh :enter =end
;al=0 :error not 0-9
gkeyn proc near
mov ah,1
int 21h
cmp al,0dh
jz gkeynx2
cmp al,30h
jc gkeynx
cmp al,39h
ja gkeynx
sub al,30h
jnz gkeyny
mov al,0ah
jmp gkeyny
gkeynx:
mov al,0
gkeynx2:
stc
jmp gkeynz
gkeyny:
clc
gkeynz:
ret
gkeyn endp
;
disperr proc near
mov ah,9
lea dx,str3
int 21h ;display error
ret
disperr endp
main endp
end main
2007-10-15 11:34:48 補充:
你寫的程式應已 OK.
至於 AL 會被修改,是 服務程式未將 AX push 的關係,
該服務程式可能為了顯示時效,而不去做 push ax 與 pop ax 兩個指令,
因實際上用此服務常式大部份都會用指標來做 loop. 較少不改變 AL
2007-10-14 19:30:06 · answer #1 · answered by carey 4 · 0⤊ 0⤋
【亞洲36588合法彩券公司直營 官網: A36588.NET 】
【 最新活動→迎接新會員,首存狂送20% 】
【運動→電子→對戰→現場→彩球 】
【免費服務 →電影區、討論區、KTV歡唱、運動轉播、即時比分、24H客服 】
【亞洲36588合法彩券公司直營 官網: A36588.NET 】
2014-08-17 19:59:52 · answer #2 · answered by Anonymous · 0⤊ 0⤋
台灣第一家合法博弈娛樂城熱烈開幕!
運動彩、遊戲對戰、現場百家樂、多國彩球
高賠率投注,歡迎您免費體驗!
官方網站 ss777.net
2013-12-29 12:32:48 · answer #3 · answered by Anonymous · 0⤊ 0⤋