assume cs:code,ds:data
data segment
db 10 dup(0)
data ends
code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,02h
call show_str
mov ax,4c00H
int 21H
dtoc:
push dx
push cx
push ax
push si
push bx
mov bx,0 ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
dtoc00:
mov cx,10d ;d表示十进制
mov dx,0
div cx ;除以10
mov cx,ax ;得到的商赋给cx
jcxz dtoc01 ;当前商为0则调到s2
add dx,30H ;将余数加上30H得到相应的ASCII码
push dx
inc bx
jmp short dtoc00
dtoc01: ;当商为0时,余数为个位
add dx,30H
push dx
inc bx ;再进行一次栈操作(补充当商为0而余数不为0时的情况)
mov cx,bx
mov si,0
dtoc02: ;s3实现将栈中的数据依次出栈放到制定内存中
pop ax
mov [si],al
inc si
loop dtoc02
dtoc03:
pop bx
pop si
pop ax
pop cx
pop dx
ret
show_str: ;显示字符串的子程序(定义开始)
push cx
push si
mov al,0a0H ;每行为160字节 a0H=160
dec dh ;行号在显存中下标从0开始,所以减1
mul dh ;相当于从(n-1)*0a0H个Byte单元开始
mov bx,ax ;定位好的位置偏移地址存放在bx里面(行)
mov al,2 ;每个字符占两个字节
mul dl ;定位列,结果ax存放的是定位好的列的位置
sub ax,2 ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2
add bx,ax ;此时bx存放的是行与列的偏移地址
mov ax,0b800H
mov es,ax
mov di,0 ;指向显存的偏移地址
mov al,cl ;cl是存放颜色的参数,这时候al存放颜色了
mov ch,0 ;下边cx存放的是每次准备处理的字符
show_str00:
mov cl,ds:[si] ;ds:[si]指向'Weclome to masm!'
jcxz show_str01
mov es:[bx+di],cl ;偶数地址存放字符
mov es:[bx+di+1],al ;奇数地址存放颜色属性
inc si
add di,2
jmp short show_str00
show_str01:
pop si
pop cx
ret
code ends
end start
【汇编语言】王爽第三版----------------实验10-3
最新推荐文章于 2024-07-08 17:33:51 发布