1.題目:鍵盤(pán)輸入一個(gè)字符串,試將其中的小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母,其它字符保持不變。
前置知識(shí):匯編語(yǔ)言常用系統(tǒng)功能調(diào)用(如果懂直接跳過(guò)看題目詳解)
1.單字符輸入(1號(hào)調(diào)用)
格式:
MOV AH,1
INT 21H
功能:從鍵盤(pán)輸入字符的ASCII碼送入寄存器AL中,并送顯示器顯示。
2.單字符顯示(2號(hào)調(diào)用)
格式:
MOV DL,待顯示字符的ASCII碼
MOV AH,2
INT 21H
功能:將DL寄存器中的字符送顯示器顯示,如果DL中為〈CTRL〉+〈BREAK〉的ASCII碼,則退出。
3.打印輸出(5號(hào)調(diào)用)
格式:
MOV DL,待打印字符的ASCII碼
MOV AH,5
INT 21H
功能:將DL寄存器中的字符送打印機(jī)打印。
4.結(jié)束調(diào)用(4CH號(hào)調(diào)用)
格式:
MOV AH,4CH
INT 21H
功能:終止當(dāng)前程序并返回調(diào)用程序。
5.顯示字符串(9號(hào)調(diào)用)
格式:
LEA DX,待顯示字符串首偏移地址
MOV AH,9
INT 21H
功能:將當(dāng)前數(shù)據(jù)區(qū)中以‘$’結(jié)尾的字符串送顯示器顯示。
6.字符串輸入(10號(hào)調(diào)用)
格式:
LEA DX,緩沖區(qū)首偏移地址
MOV AH,10
INT 21H
功能:從鍵盤(pán)上輸入一字符串到用戶(hù)定義的輸入緩沖區(qū)中,并送顯示器顯示。
3.各步驟詳細(xì)講解:
(1)基本框架:
DATAS SEGMENT
;此處輸入數(shù)據(jù)段代碼
string db 10,?,10 dup(?)
DATAS ENDS
STACKS SEGMENT
;此處輸入堆棧段代碼
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此處輸入代碼段代碼
MOV AH,4CH
INT 21H
CODES ENDS
END START
(2)步驟1:
mov dx,offset String ;
mov ah,0ah
int 21h
mov si,offset String+1
mov cx ,0
mov cl,[si]
經(jīng)過(guò)常用的系統(tǒng)功能調(diào)用知識(shí)的回顧不難看出前3行是輸入字符串;
第4行把string+1的偏移地址送給si寄存器。
有人問(wèn):為什么是string+1?
下面給出一個(gè)數(shù)據(jù)的實(shí)例:
buffer db 81
;定義緩沖區(qū),第1個(gè)字節(jié)填入可能輸入的最大字符數(shù)
db 0
;第2個(gè)字節(jié)將用于存放實(shí)際輸入的字符數(shù)
db 81 dup(0)
;第3個(gè)字節(jié)開(kāi)始用于存放輸入的字符串
10號(hào)調(diào)用從鍵盤(pán)上輸入一字符串到用戶(hù)定義的輸入緩沖區(qū)中,并送顯示器顯示。入口參數(shù)為DS:DX。
例:從鍵盤(pán)上輸入字符串’WELCOME’
DATA SEGMENT 'DATA'
BUFF DB 10,0,10 DUP(?)
DATA ENDS
CODE SEGMENT 'CODE'
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,OFFSET BUFF
MOV AH,0AH
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
存儲(chǔ)如下:
同理,string+2就是實(shí)際存儲(chǔ)的字符串的首地址。
mov cx ,0
mov cl,[si]
這兩行,先將CX清零,再把si指向的字節(jié)內(nèi)容給cl,這兩句也可以寫(xiě)成mov cx,[si]。CX是循環(huán)的條件之一,代表循環(huán)進(jìn)行多少次,見(jiàn)下文。這里就是把字符串的實(shí)際大小給CX。
(3)步驟2:
lp: inc si
mov al,[si]
cmp al,'a' ;每個(gè)字符判斷是否<'a'或者>'z',是則直接轉(zhuǎn)到下一個(gè)字符,否就轉(zhuǎn)換成小寫(xiě)字符
jb next
cmp al,'z'
ja next
sub al,20h
mov [si],al
next:
loop lp
注意:* CX 中存放循環(huán)次數(shù)
- 只能使用段內(nèi)直接尋址的8 位位移量
LOOP
LOOPZ / LOOPE
LOOPNZ / LOOPNE
執(zhí)行步驟:
(1) (CX) ← (CX) - 1
(2) 檢查是否滿(mǎn)足測(cè)試條件,如滿(mǎn)足則
(IP) ← (IP) + 8位位移量,實(shí)行循環(huán);
不滿(mǎn)足則 IP 不變,退出循環(huán)。
循環(huán)指令:LOOP OPR
測(cè)試條件:(CX) !=0
為零或相等時(shí)循環(huán)指令:LOOPZ(LOOPE) OPR
測(cè)試條件:ZF=1 且 (CX) !=0
不為零或不相等時(shí)循環(huán)指令:LOOPNZ(LOOPNE) OPR
測(cè)試條件:ZF=0 且 (CX) !=0文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-778061.html
(4)步驟3:
mov byte ptr [si+1],'$' ;因?yàn)?span id="n5n3t3z" class="token number">9號(hào)調(diào)用字符串以'$'結(jié)尾,所以我們?cè)诮Y(jié)尾加上
mov ah,2
mov dl,0ah ;換行
int 21h
mov dl,0dh ;回車(chē)
int 21h
mov dx,offset String+2
mov ah,9
int 21h ;調(diào)用9號(hào)DOS中斷,顯示首地址為DS:DX的字符串
完整代碼:
DATAS SEGMENT
;此處輸入數(shù)據(jù)段代碼
string db 10,?,10 dup(?)
DATAS ENDS
STACKS SEGMENT
;此處輸入堆棧段代碼
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此處輸入代碼段代碼
mov dx,offset String
mov ah,0ah
int 21h
mov si,offset String+1
mov cx ,0
mov cl,[si]
lp: inc si
mov al,[si]
cmp al,'a'
jb next
cmp al,'z'
ja next
sub al,20h
mov [si],al
next:
loop lp
mov byte ptr [si+1],'$'
mov ah,2
mov dl,0ah
int 21h
mov dl,0dh
int 21h ;換行
mov dx,offset String+2
mov ah,9
int 21h ;調(diào)用9號(hào)DOS中斷,顯示首地址為DS:DX的字符串
MOV AH,4CH
INT 21H
CODES ENDS
END START
運(yùn)行結(jié)果
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-778061.html
到了這里,關(guān)于匯編語(yǔ)言(Assembly Language)習(xí)題:鍵盤(pán)輸入一個(gè)字符串,試將其中的小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母,其它字符保持不變。的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!