王爽实验9.自己解读,代码注释很多!

实验9,PDF中的内容:

代码【注释较全面】:

代码阅读性好点的:https://www.52pojie.cn/thread-1246296-1-1.html

assume cs:code,ds:data,ss:stack
data segment
	db 'welcome to masm!';定义显示字符串,16个字节
	db 02h,24h,71h;定义颜色
data ends

stack segment
	dw 8 dup(0);保留栈段空间,用来保存ax,bx,cx
stack ends

code segment
start:
	mov ax,data
	mov ds,ax
	mov ax,stack
	mov ss,ax
	mov sp,10h
	
	xor bx,bx;保证bx为0
	mov ax,0b872h;复杂的计算产出的东西。屏幕25*80
	;80个字符,一个字符是两个字节,故而屏幕一行就是160个字节!
	;字符串为16个字节,所以就是(11*16+32*2=1824d,就是720h)
	
	mov cx,3
	s3: push cx;记录循环次数!
		push ax;记录起始位置!
		push bx;用于记录颜色!
		
		mov es,ax
		
		mov si,0
		mov di,0
		mov cx,10h;循环16次,依次存放全部字符进入显存
	s1:mov al,ds:[si]
		mov es:[di],al
		inc si
		add di,2;因为,显存格式为[字符,颜色].所以要为存储颜色区域保留一些存储空间!
		loop s1;循环存储所有的“welcome to masm!”存储进入显存存储区域。
		
		mov di,1;修改啦,要进行写入颜色所对应的位置啦!
		pop bx
		mov al,ds:10h[bx];因为颜色存储在第二行。
		inc bx
		
		mov cx,10h
	s2:mov es:[di],al;写入颜色!
	   add di,2;进行位移。写入一行的颜色。
	   loop s2
	   
	   pop ax
	   add ax,0ah;ax增加160,进行换行,便于操作下一行的东西。
	   
	   pop cx;拿出最初入栈的用于循环的cx进行记录次数!
	   loop s3
	   
	   mov ax,4c00h
	   int 21h
code ends
end start


代码截图:

运行:


OK

猜你喜欢

转载自blog.csdn.net/weixin_42859280/article/details/108003600