编程:在屏幕中间分别显示绿色,绿底红色、白底蓝色的字符串‘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