本章的實驗比較簡單,但是還是貼在這里吧。
編寫一個子程序,將包含任意字符,以0結尾的字符串中的小寫字母轉變成大寫字母,描述如下。
名稱:letterc
功能:將以0結尾的字符串中的小寫字母轉變成大寫字母
參數:ds:si指向字符串首地址
代碼:

letterc
DATAS SEGMENT
db "Beginner's All-purpose Symbolic Instruction Code.",0
DATAS ENDS

STACKS SEGMENT
;此處輸入堆棧段代碼
dw 16 dup (0)
STACKS ENDS

CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov ax,STACKS
mov ss,ax
mov sp,32
mov si,0
mov cl,72h
mov dx,50ah
call show_str
call letterc
mov cl,74h
mov dx,60ah
call show_str
MOV AH,4CH
INT 21H
;名稱letterc
;功能:將以0結尾的字符串中的小寫字母轉變成大寫字母
;參數:ds:si指向字符串首地址
letterc:
pushf
push cx
push si
sub cx,cx
let:
mov cl,[si]
jcxz letok
cmp cl,'a'
jb continue
cmp cl,'z'
ja continue
sub cl,20h
mov [si],cl
continue:
inc si
jmp let
letok:
pop si
pop cx
popf
ret
;名稱:show_str
;功能:在指定位置,用指定的顏色,顯示一個用0結束的字符串
;參數:(dh)=行號,(dl)=列號,(cl)=顏色,ds:si指向字符串的首地址
show_str:
push ax
push cx
push dx
push es
push si
push di
;根據行號設置基址為bp
mov ax,160
mul dh
mov bp,ax
;根據列號設置基址為di
mov dh,0
add dx,dx ;沒個字符對應2個字節,所以列號*2
mov di,dx
;顯存段地址
mov ax,0b800h
mov es,ax
;保存顏色屬性到al中
mov al,cl
sub cx,cx
s:
mov cl,[si] ;取字符
jcxz ok
mov es:[bp+di],cl ;寫字符
mov es:[bp+di].1,al ;設置顏色屬性
add di,2
inc si
loop s
ok:
pop di
pop si
pop es
pop dx
pop cx
pop ax
ret
CODES ENDS
END START
運行結果:
在上面的代碼中,為了將變換后的結果顯示出來,我還引入了show_str子程序,以顯示字符串內容。