(在指定位置显示指定颜色字符串)王爽汇编语言第三版实验10.1

功能

在指定位置用指定的颜色,显示一个用0结束的字符串
在屏幕的8行3列,用绿色显示data段中的内容

代码部分

1.初始化

首先data段中给定指定的字符串并且以0结尾
stack栈段初始为空

assume cs:code,ds:data,ss:stack
data segment
	db 'Welcome to masm!',0
data ends
stack segment stack
	db 128 dup(0)
stack ends

初始化ss,sp表示栈

		mov ax,stack
		mov ss,ax
		mov sp,128

调用初始化函数,用来初始化ds表示数据段,es表示屏幕中的位置

init_reg:
		mov bx,0b800h
		mov es,bx

		mov bx,data
		mov ds,bx
		ret

题目要求我们显示在第八行第三列,我们分别写设置行和列的函数

行的函数,每行占160字节所以我们只要将寄存器设置成160*行数,然后再用es+寄存器即可

get_row:
		mov al,160
		mul dh
		ret	

列的函数,每个位置占两个字节第一个表示内容,第二个表示颜色,所以这里我们要给列数*2,然后用es+寄存器即可

get_col:
		mov al,2
		mul dl
		ret
2.清理屏幕

题目中没有让清理屏幕,但是这里为了美观我们写一个清理屏幕的函数
直接将dx设置成0700h 07表示空 00表示没有颜色,然后设置循环次数2000次,每次将dx赋值给es:[di]即可,记得要push pop用到的寄存器

clear_screen:
		push bx
		push cx
		push es
		push si

		mov bx,0b800h
		mov es,bx
		mov si,0
		
		mov dx,0700h
		mov cx,2000
clearscreen:
		mov es:[si],dx
		add si,2
		loop clearscreen

		pop si
		pop es
		pop cx
		pop bx
		ret

3.显示字符串

大体思路:将ds中的内容赋值给cl,然后先判断如果cl为0直接跳出循环,循环中给es:[si]赋值显示内容,es:[si+1]赋值颜色

show_string:
		push ax
		push cx
		push es
		push ds
		push di
		push si


		mov cx,0

showstring:
		mov cl,ds:[si]		
		jcxz show_string_ret	;字符串以0结尾(循环出口)
		mov es:[di],cl
		mov es:[di+1],dl
		add di,2
		inc si
		jmp showstring	

show_string_ret:
		pop si
		pop di
		pop ds
		pop es
		pop cx
		pop ax

		ret
完整代码
assume cs:code,ds:data,ss:stack
data segment
	db 'Welcome to masm!',0
data ends
stack segment stack
	db 128 dup(0)
stack ends
code segment

	start:
		mov ax,stack
		mov ss,ax
		mov sp,128

		call init_reg

		mov di,0
		mov dh,8
		call get_row		;行
		add di,ax

		mov dl,3
		call get_col		;列
		add di,ax

		call clear_screen	;清理屏幕

		mov cl,2
		mov dl,cl		;颜色
		call show_string	;显示字符串
		

		mov ax,4c00h
		int 21h

;================================================
clear_screen:
		push bx
		push cx
		push es
		push si

		mov bx,0b800h
		mov es,bx
		mov si,0
		
		mov dx,0700h
		mov cx,2000
clearscreen:
		mov es:[si],dx
		add si,2
		loop clearscreen

		pop si
		pop es
		pop cx
		pop bx
		ret


;================================================
show_string:
		push ax
		push cx
		push es
		push ds
		push di
		push si


		mov cx,0

showstring:
		mov cl,ds:[si]		
		jcxz show_string_ret	;字符串以0结尾(循环出口)
		mov es:[di],cl
		mov es:[di+1],dl
		add di,2
		inc si
		jmp showstring	

show_string_ret:
		pop si
		pop di
		pop ds
		pop es
		pop cx
		pop ax

		ret

;================================================
get_col:
		mov al,2
		mul dl
		ret


;================================================
get_row:
		mov al,160
		mul dh
		ret	


;================================================
init_reg:
		mov bx,0b800h
		mov es,bx

		mov bx,data
		mov ds,bx
		ret

效果

在这里插入图片描述
汇编真好玩

猜你喜欢

转载自blog.csdn.net/weixin_46035615/article/details/124132762