没啥难度.贴出代码.
assume cs:code
data segment
db "Beginner's All-purpose Symbolic Instruction Code. ",0
data ends
tmp_data segment
db 51 dup (0)
tmp_data ends
code segment
begin:mov ax,data
mov ds,ax
mov si,0
mov ax,tmp_data ;临时存放转化后的字符串.最后用movsb传送到ds:si处覆盖原字符串
mov es,ax
call letterc
mov ax,4c00h
int 21h
letterc:
;=================================================================
;功能:将以0结尾的字符串中的小写字母转变为大写字母
;ds:si指向字符串的首地址
;=================================================================
;ascii中.字母小为97(a)-122(z),大写->小写,+20H
mov di,0
s:
mov ch,0
mov al,ds:[si]
mov cl,al
jcxz all_done ;如果为0则转化完成
mov es:[di],al ;不管是不是小写字母.先移到es段
cmp al,97
jnb ok_1 ;大于或等于97就跳
jmp next ;小于97. 说明不是小写字母.跳下一个
ok_1:cmp al,122 ;小于或等于122就跳
jna ok_2 ;大于122.说明不是小写字母.跳下一个
jmp next
ok_2: ;执行到这里说明是小写字母.开始转换
sub al,20H ;小写字母-32=大写字母.
mov es:[di],al ;送es段.
next:inc si
inc di
jmp short s
all_done: ;全部完成.传送到ds段
push es ;交换ds和es段
push ds
pop es
pop ds ;ds:si指向转换完成后的字符串
mov dh,10
mov dl,10
mov cx,2 ;调用show_str打印在8行8列绿色的字.
call show_str
ret
show_str:
;===============================================================================
;功能:显示ds段开始的字符串在dh行。dl列。样式为cl,字符串以0结尾
;参数:ds段
;返回值:无
;===============================================================================
push dx
mov al,0A0H ;一行160个字节
dec dh ;行数从0开始.所以dh-1
mul dh ;一共160*(dh-1)个字节
mov bx,ax ;送bx
mov al,2 ;一列2个字节
mul dl ;一共2*dl个字节
sub ax,2 ;列也是从0开始.并且字符放奇数位.所以ax-2
add bx,ax ;行列相加
mov ax,0B800H ;基址为0B800H
mov es,ax ;送es
mov si,0
mov ch,0 ;高位置0
mov di,0
mov ax,cx ;保存样式到ax
show_str_s:
mov cl,[di] ;送cx
jcxz ok ;判断是否到字符串尾,是则返回.否则继续
mov es:[bx+si],cl ;奇数位,字符串
mov es:[bx+si+1],al ;偶数位,样式
inc di
add si,2
jmp short show_str_s
ok:
pop dx
ret
code ends
end begin |