汇编语言实验10.1显示字符串

236 阅读1分钟

实验环境

win10、dosbox、masm5.17

实验内容:显示字符串

显示字符串是现实工作中经常要用到的功能,应该编写一个通用的子程序来实现这个功能。我们应该提供灵活的调用接口,使调用者可以决定显示的位置(行、列)、内容和颜色。

要求

提供一个子程序在指定的位置,用指定的颜色,显示一个用0结束的字符串。

代码实现

assume cs:code,ds:data,ss:stack
data segment
	db 'Hello World',0
data ends

stack segment
	db 8 dup(0)
	db 8 dup(0)
stack ends

code segment
start:	        mov dh,8		;第八行
		mov dl,3		;第三列
		mov	cl,2		;绿色
		
		mov ax,data		;声明数据段
		mov ds,ax
		mov si,0
		
		mov ax,stack	        ;声明栈段
		mov ss,ax
		mov sp,10h
		
		call show_str		
		
		mov ax,4c00h
		int 21h
		
show_str:       push bx		        ;bx,cx,ax入栈
		push cx		
		push ax
		
		mov ax,0b800h	        ;显存地址段
		mov es,ax
		
		mov ax,0a0h		;先计算行偏移地址,以免在循环中重复执行
		mul dh
		mov bx,ax
		
show:	        mov al,2h		;先计算列偏移地址,空出ax寄存器
		mul dl
		mov di,ax

		mov al,cl		;颜色暂存到al
		
		xor cx,cx		;清零,否则jcxz永远不会退出
		mov cl,[si]		;数据传送到cl寄存器,低位
		jcxz ok			;比较cx的值,如果等于0,子程序返回
		
		mov ch,al		;颜色放在高位
		mov es:[bx][di],cx	;把数据传送到显存
		mov cl,al		;还原颜色
		
		inc si
		inc dl
		jmp short show
		
	ok:	pop ax			;ax,cx,bx弹栈
		pop cx			
		pop bx			
		ret
code ends
end start