丁同亚的博客
夺朱非正色
;在指定位置,指定颜色,显示一个用0结束的字符串
;dh:行号(0-24),dl:列号(0-79),cl:颜色,ds:si指向字符串的首地址

assume cs:code,ds:data,ss:stack

data segment
	db 'Welcome to masm! I am dty', 0
data ends

stack segment
	db 20h dup(0)
stack ends

code segment
	start:
		mov ax,data
		mov ds,ax
		mov ax,stack
		mov ss,ax
		mov sp,20h;初始化段
		
		mov dh,5
		mov dl,4
		mov cl,2
		mov si,0;参数放到寄存器
		call show_str
		mov ax,4c00h
		int 21h

	show_str:
		push cx
		push si
		push dl;乘法可能会用到dx		,所以先保存到堆栈
		mov ax, 0B800h;0B800h显存的基址
		mov es, ax        ; 设置显存段
		
		xor ax,ax
		mov al,dh
		mov bx,160
		mul bx
		mov di,ax;行号*160 = 偏移
		mov ax,0
		
		pop dl
		mov al,dl
		mov bx,2
		mul bx
		add di,ax;行偏移加上列偏移
		

		s:
		mov al,ds:[si];
		mov cl,[si]
		mov ch,0
		jcxz ok;取出字符串,放到al和cx里,jcxz判断CX是不是0,是0的话跳转到ok 结束
		
		mov byte ptr es:[di],al;
		mov bp,sp
		mov bl,byte ptr ss:[bp+2];颜色信息在子程序开始的时候放到了堆栈里,这里取出颜色信息
		mov byte ptr es:[di+1],bl;将颜色信息放到显存
		add di,2
		add si,1
		jmp short s
		
		ok:	
		pop si
		pop cx;堆栈平衡
		
		ret


code ends
end start

 

posted on 2025-04-07 11:42  丁同亚的博客  阅读(16)  评论(0)    收藏  举报