运行效果:
下面是代码:
; 要求:将ds:[si]开始,以0结束的字符串中的小写字母变为大写字母显示。
; 概要算法:小写字母的范围为61~7A,比大写字母多20,所以算法就是判断是否为小写字母,如果为小写字母则减掉20
; 详细算法:
; 1、结尾字节为0,所以可以使用jcxz来判断整个字符串的结束,这已经是常用手法了。。。
; 2、对每个字节作判断,一种方法是直接判断(判断 大于61和小于7A),一种是间接判断(判断小于61和大于7A)。是小写字母的则减去20
; 3、重复循环
assume cs:code
data segment
db "Beginer's All-purpose Symbolic Instruction Code", 0
data ends
stack segment
stack ends
code segment
Main:
mov ax, data
mov ds, ax
mov si, 0
call letterc
mov si, 0
mov dh, 3
mov dl, 2
mov cl, 2
call show_str
mov ah, 01h
int 21h
mov ax, 4c00h
int 21h
; 名称:letterc
; 功能:将小写
; 参数:ds:[si] 开始,以0结束的字符串
; 返回:无
letterc:
mov ch, 0
s_letterc:
mov cl, ds:[si]
jcxz end_letterc ; 字节为0就结束
cmp cl, 61h
jb s0_letterc ; 小于61
cmp cl, 07ah
ja s0_letterc ; 大于7A
sub cl, 20h
mov ds:[si], cl
s0_letterc:
inc si
jmp short s_letterc
end_letterc:
ret
; 名称:show_str
; 功能:指定位置,用指定颜色,显示一个用0结束的字符串
; 参数:(dh) = 行号(0--24),(dl) = 列号(0--79)
; (cl) = 颜色,ds:si 指向字符串的首地址
; 返回:无
show_str:
push ax
push bx
push cx
push dx
push es
; 计算好字串开始显示的地址Y = 160*(行数-1) + 列数*2-2, B800 : Y
; 循环将参数里的字串写进显卡内存,并检测到0就返回
; bx = 160*(行数-1)
sub dh, 1h
mov al, 160
mul dh
mov bx, ax ; bx 为根据行数算出来的偏移值
; ax = 列数*2-2
mov al, 2
mul dl
sub ax, 2 ; 根据列数算出来的偏移值
add bx, ax ; 行数和列数的和存在bx中了
mov ax, 0b800h
mov es, ax
mov dl, cl ; 保存字体颜色属性
mov ch, 0
s_show_str:
mov cl, ds:[si]
mov es:[bx], cl
jcxz ok_show_str
mov es:[bx+1], dl
inc si
add bx, 2
jmp short s_show_str
ok_show_str:
pop es
pop dx
pop cx
pop bx
pop ax
ret
code ends
end Main