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

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

おすすめ

転載: blog.csdn.net/a851248662/article/details/79322562