实验 11 编写子程序
编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母,描述如下。
名称:letterc
功能:将以0结尾的字符串中的小写字母转变成大写字母
参数:ds:si指向字符串首地址
应用举例:
assume cs:codesg
datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends
codesg segment
begin: mov ax, datasg
mov ds, ax
mov si, 0
call letterc
mov ax, 4c00H
int 21H
letterc: ?
codesg ends
end begin
分析:
1.数据段datasg中定义的数据除了有大小写字母外还有标点符号。
2.判断是否结尾,用jcxz(CX=0)即跳转。
3.只需将字符串的小写转大写,小写大写的ASCII都是连续的,可用条件跳转。
4.优化程序,将结果显示在屏幕上。
代码如下:
# 编写一个子程序,将包含任意字符,以 0 结尾的字符串中的小写字母转变成大写字母
assume cs:codesg
datasg segment
db "Beginner;s All-purpose Symbolic Instruction Code.",0 ;49长度 加上结尾的0等于50
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov si,0
call letterc ; 转换大写子程序
call display ; 通用子程序,将内容显示在屏幕上
mov ax,4c00h
int 21h
letterc: push cx
push si
push ax
s0: mov cl,[si] ; 取值
mov ch,0
jcxz ok ; 如果是0 跳转到ok子程序,表示字符串结尾
cmp cl,'a' ; 比较
jb next ; 如果当前字符小于a
cmp cl,'z'
ja next ; 如果大于z
; 经过层层筛选,当前字符在a~z之中
jmp short conversion
next: inc si ; 下一个
jmp short s0
conversion: and cl, 11011111B
mov [si],cl
jmp next ;转换完成 继续下一个
ok: pop ax
pop si
pop cx
ret
display: push si
push cx
push di
push ax
push es
push bx ; 子程序中用到的寄存器都压栈
mov si,0
mov di,0
mov ax,0b800h ;0b8000h ~ 0b8f9fh 中的4000个字节的内容会出现在显示器上
mov es,ax
mov bx,140h ;140h表示第三行,总共25行 (80*25)
add bx,0ah ;从第10列开始显示
mov al,6 ;颜色
s1: mov cl,ds:[di] ; 取值 (低位存字符)
mov ch,0
jcxz exit
mov ch,al ; 高位存字符属性
mov es:[bx+si],cx ;cx低位cl是ds:[di]中的字符,高位ch是红底高亮绿字
add si,2
inc di
jmp s1
exit: pop bx
pop es
pop ax
pop di
pop cx
pop si
ret
codesg ends
end start