王爽汇编语言 实验9-------个人记录(学完后面的记得回来改)------!

题目:

1、屏幕中间,显示3行‘welcome to masm!’;
2、黑底绿字、绿底红字、白底蓝字

思路:

1、确定data段的数据内容,‘welcome to masm!’,‘02h,24h,71h’,将数据写入显存
2、确定写入地址:
1、行:B800:0000第一行第一个字,每行160字节,满屏幕25行,确认行号(25-3)/2=11,即从第12
行开始显示内容,16012=0780H,开始写入的地址为B8780H(第12行)。
2、列:00-01为第一列,满屏80列,确认列号(80-16)/2=32,即从第32列(32
2-2=62 3eh)开始写入W…
3,、整合一下,起始地址:B800:07be 第一行(B87beH)
B80a:07be 第二行(B885eH)
B814:07be 第三行(B88feH)
固定了偏移地址的起始位置,在循环中改变段地址的位置;
3、使用loop语句来写入内存,外层cx=3,内层cx=16(字符串长度);

代码

assume cs:code,ds:data
data segment
db 'welcome to masm!'
db 02h,24h,71h
data ends
code segment
start: 	mov ax,data
	mov ds,ax
	mov bp,0b800h
	mov es,bp
	mov si,0
	mov dx,0
	mov bx,0
	mov di,0
	mov cx,3
s: mov dx,cx
 	mov cx,16
	s0: mov al,ds:[bx]          
		mov es:[bx+7beh+di],al	//写入字符串,因为需要占用两个字节,所以一个变量不够,【bx+bx+64】
		                          编译器不认,所以新增一个di变量来定位
		mov al,ds:[si+16]		//data段的第16个字节开始是字体颜色,
		mov es:[bx+7bfh+di],al    //定位字符属性,在字符的后一位,字符+64,属性+65
		inc di
		inc bx
		loop s0
	mov bx,0   					//因为选择的是固定偏移地址,所以需要重置偏移地址变量
	mov di,0
	inc si						//外循环来改变每行的字体属性
	add bp,0ah					//用bp来改变段地址,实现换行
	mov es,bp
	mov cx,dx	
	loop s
	mov ax,4c00h
	int 21h
code ends
end start

dos-box结果

在这里插入图片描述

乱七八糟没解决的问题

1、【bx+bx+64】不可以这样用
2、改用栈段写一次,除了寄存cx外,还可以保存段地址能省一个寄存器,有时间可以尝试将段地址push后恢复,然后add后再push,目前不明白好处在哪里,就觉得挺麻烦的。
3、add,sub不可以访问段寄存器

发布了4 篇原创文章 · 获赞 0 · 访问量 38
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览