(1)從鍵盤輸入一個字符串(串長不大於80)。
(2)以十進制輸出字符串中非字母字符的個數(不是a to z或 A to Z)。
(3)輸出原字符串且令非字母字符閃爍顯示。
(4)找出字符串中ASCII碼值最大的字符,在字符串中用紅色顯示。
(5)字符串的輸入和結果的輸出都要有必要的提示,且提示獨佔一行。
(6)要使用到子程序。
data segment
hintinput db "please input a string:$"
hintoutput1 db "The number of non-alphabetic characters:$";輸出非字母字符的個數
hintoutput2 db "flashes non-alphabetic characters:$";輸出原字符串並閃爍
hintoutput3 db "The character with the largest ASCII value in a string:$";ascill最大字符
buf db 200
db ?
db 200 dup(?)
count db 0
crlf db 0ah,0dh,'$'
data ends
stack segment stack
string db 500 dup(?)
stack ends
extra segment ;定義附加段
extra ends
codes segment
assume cs:codes,ds:data,ss:stack,es:extra
main proc far
start:
mov ax,data ;分別將數據段,堆棧段,附加段送入代碼段
mov ds,ax
mov ax,stack
mov ss,ax
mov ax,extra
mov es,ax
;---------------------------輸入字符串提示語並進行回車換行
lea dx,hintinput ;輸入提示語
mov ah,9;輸出功能入口在dx
int 21h
lea dx,crlf;輸入提示語後,回車換行
mov ah,09
int 21h
;---------------------------通過a號功能進行字符串輸入操作並回車換行
mov ah,0ah;輸入功能入口在dx
lea dx,buf
int 21h
lea dx,crlf ;輸入後回車換行
mov ah,9
int 21h
;------------------------------------首先用cl儲存字符串長度,si源變址寄存器指向串真正開始的地方
mov cl,buf+1;cl中放置實際字符串長度
lea si,buf+2;si放置字符串首地址
;------------------------------------首先輸出提示語回車換行,以十進制輸出字符串中非字母字符的個數(不是a to z或 A to Z)。
call print1
;--------------------------------------
call print2
;---------=----------------------------
call print3
;--------------------------------------
mov ah,4ch
int 21h
main endp
print1: ;-----------------子程序一入口
push cx
push si
lea dx,hintoutput1 ;輸出提示語
mov ah,09h;輸出功能入口在dx
int 21h
lea dx,crlf;輸入提示語後,回車換行
mov ah,09
int 21h
mov dl,0 ;用dl來計數,統計符串中非字母字符的個數
L0:
mov al,[si]
cmp al,'A'
jb L1 ;如果字符<'A',跳轉到L1
cmp al,'Z'
jbe L2 ;如果字符<='Z',跳轉到L2
cmp al,'a'
jb L1 ;如果字符<'a',跳轉到L1
cmp al,'z'
jbe L2 ;如果字符<='Z',跳轉到L2
L1:
inc dl ;計數器加1
L2:
inc si
dec cl
jnz L0
;----------------------------------輸出非字母字符的個數dl
cmp dl,9h
jbe L ;如果非字母個數小於10,則直接加30輸出
mov dh,0 ;否則把dx存入ax中
mov ax,dx
mov bl,10 ;ax除以10後,ah作爲商
div bl ;al作爲餘數
mov dl,al
add dl,30h ;先輸出商,再輸出餘數,就是10進制了
mov ah,02h
int 21h
mov dl,ah
L:
add dl,30h
mov ah,02h
int 21h
lea dx,crlf ;輸出後,回車換行
mov ah,09
int 21h
pop si
pop cx
ret
print2:
lea dx,hintoutput2 ;輸出提示語
mov ah,09h ;輸出功能入口在dx
int 21h
lea dx,crlf ;輸入提示語後,回車換行
mov ah,09h
int 21h
push cx
push si
cld ;方向標誌位df清零
L3:
push cx
lodsb ;從字符串串中取數據至al
cmp al,'A'
jb L4 ;如果字符<'A',跳轉到L4
cmp al,'Z'
jbe L5 ;如果字符<='Z',跳轉到L5
cmp al,'a'
jb L4 ;如果字符<'a',跳轉到L4
cmp al,'z'
jbe L5 ;如果字符<='Z',跳轉到L5
L4: ;如果不是字母,則進行閃爍輸出
mov bl,10000111b ;bl屬性閃爍輸出
mov bh,0 ;顯示頁爲0
mov cx,1 ;顯示字符爲1個
mov ah,09h
int 10h ;輸出bl屬性的字符串
mov ah,03h
int 10h ;讀光標位置
inc dl ;輸出列+1
mov ah,02h
int 10h ;置光標位置
jmp L6
L5:
mov bl,00000111b ;bl屬性爲平常輸出
mov bh,0 ;顯示頁爲0
mov cx,1 ;顯示字符個數爲1個
mov ah,09h
int 10h ;輸出屬性爲bl的字符
mov ah,03h
int 10h ;讀光標位置
inc dl ;輸出列+1
mov ah,02h
int 10h ;置光標位置
L6:
pop cx
loop L3
lea dx,crlf ;輸入提示語後,回車換行
mov ah,09
int 21h
pop si
pop cx
ret
print3:
lea dx,hintoutput3 ;輸出提示語
mov ah,09h ;輸出功能入口在dx
int 21h
lea dx,crlf ;輸入提示語後,回車換行
mov ah,09
int 21h
push cx
push si
;count用來存放ascill最大的字符
L7:
mov al,[si]
cmp al,count ;比較al和count的大小,如果al>count,則令al=count
jbe L8
mov count,al
L8:
inc si
dec cl
jnz L7
pop si
pop cx
cld
L9:
push cx
lodsb ;從串中取數據至al
cmp al,count
jz L11 ;如果字符==ascill碼最大字符
L10:
mov bl,00000111b ;bl屬性正常輸出
mov bh,0 ;顯示頁爲0
mov cx,1 ;顯示字符爲1個
mov ah,09h
int 10h ;輸出bl屬性的字符串
mov ah,03h
int 10h ;讀光標位置
inc dl ;輸出列+1
mov ah,02h
int 10h ;置光標位置
jmp L12
L11:
mov bl,00000100b ;bl屬性爲紅色輸出
mov bh,0 ;顯示頁爲0
mov cx,1 ;顯示字符個數爲1個
mov ah,09h
int 10h ;輸出屬性爲bl的字符
mov ah,03h
int 10h ;讀光標位置
inc dl ;輸出列+1
mov ah,02h
int 10h ;置光標位置
L12:
pop cx
loop L9
lea dx,crlf ;輸出後,回車換行
mov ah,09
int 21h
ret
codes ends
end start
希望大家不吝賜教,在下面支出我的錯誤,謝謝