您的位置:首页 > 其它

【汇编语言】王爽第三版----------------实验10-3

2018-02-13 17:46 399 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: