本章的实验比较简单,但是还是贴在这里吧。
编写一个子程序,将包含任意字符,以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子程序,以显示字符串内容。