实验9 根据材料编程

编程:在屏幕中间分别显示绿色,绿底红色、白底蓝色的字符串‘welcome to masm!’。

估计材料这么长(~ ̄(OO) ̄)ブ大家都没啥耐心去看,我总结了一下。

1、在内存区B8000H~BFFFFH区间中写入数据会显示在显示器上,还记得实验1的时候的图案吗。

2、显示器可以显示25行,每行80个字符。

3、一个字符要占2个字节,分别存放字符的askll码和属性(颜色啊等等)

4、显示区可分为8页。而第0页的内容在内存B8000H~B8F9H中

    在000~09F中对应显示器上的第一行(160个字节为1行)

    在0A0~13F对应显示器上的第二行

    如此类推。。。

5、而对应的列就是

    00~01为第一列

    02~03为第二列

因为每个字符都要两个字节,这样好理解写,如此类推。。。9E~9F对应80列

6、假设02H对应的是黑底绿色,‘A’的askll码为41H

则在B800:0000    41 02 00 00 00 00 00

这样会在第一行第一列显示'A'

7、至于对应的颜色是什么数字。自己理解下格式,书本给出了一堆二进制对应的例子。


分析程序:

首先要算出三种颜色对应的16进制数,其中

绿色:0000 0010    02h

绿底蓝色:0010 0100    24h

白底蓝色:0111 0001    71h


然后推出偏移量,算到中间:

第12行偏移:12*160    780h

第40列偏移:4eh

相加为7ceh,然后分别除上下,和对称左右整个程序就搞定了


assume cs:codesg,ds:data

data segment
	db 'welcome to masm!'
data ends

codesg segment
start:
	mov ax,data
	mov ds,ax	;定义ds为数据段
	mov bx,0
	mov ax,0B800H
	mov es,ax	;es为显示段
	
	mov bp,720h	;11行中间列开头,本来是72e的,但是为了中间对称
	mov cx,16	;16次循环
s1:	mov ax,[bx]
	mov es:[bp],ax
	mov byte ptr es:[bp+1],02h
	add bp,2
	inc bx
	loop s1
	
	mov bp,7c0h	;同上
	mov bx,0	;记得数据区的偏移要重新指向第一个字母
	mov cx,16
s2:	mov ax,[bx]
	mov es:[bp],ax
	mov byte ptr es:[bp+1],24h
	add bp,2
	inc bx
	loop s2
	
	mov bp,860h
	mov bx,0
	mov cx,16
s3:	mov ax,[bx]
	mov es:[bp],ax
	mov byte ptr es:[bp+1],71h
	add bp,2
	inc bx
	loop s3
	
	
	mov ax,4c00h
	int 21h
	
codesg ends

end start

猜你喜欢

转载自blog.csdn.net/a673953508/article/details/80722407