这是书中的实验9,编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串‘welcome to masm!’。
分析:
1 、绿色: 0 000 0 010b(二进制) 十六进制 02h
绿底红色:0 010 0 100(二进制)十六进制 24h
白底蓝色:0 111 0 001(二进制)十六进制 71h
2、程序要求在屏幕中间分别显示,因为每行有80个字符,每个字符占2个字节分别存放ASCIL码和属性,所以每行有160个字节。所以,'welcome to masm!'共有16个字符所以需要32个字节来存放。
3、题目中写出: " 显示缓冲器分为8(0-7)页地址从[B8000H - BFFFFH ,共32KB],在第0页( B8000H - B8F9FH 共占4000字节)显示缓冲区中:
偏移000H-09FH对应显示器上的第1行(80个字符占160个字节A0H个字节);
偏移0A0H-13FH对应显示器上的第2行;
偏移140H-1DFH对应显示器上的第3行;
依此类推,可知,偏移F00 - F9F 对应显示器上的第25行。"
现在,我们要把 'welcome to masm!' 写在第0页中,当然也可写在其它页(0 - 7 )页都可以 。现在我们要写在第0页中。第0页地址从 B8000H - B8F9FH 共占4000字节而我们的需要把三行写到40000个字节的中间! 所以这个起始地址为 (4000-3*160)/2=1760 ==> 1760+(160-32)/2=1824 = 720H + B8000H = B8720H
地址为:B8720H 段地址表示为: B872H:0000H 。
代码如下:
1 assume cs:code,ds:data 2 3 data segment 4 db 'welcome to masm!' 5 db 02h,24h,71h ;字符属性值 6 data ends 7 8 code segment 9 start: mov ax,data 10 mov ds,ax 11 mov ax,0b872H ;三个字符串中第一个的首地址 12 mov es,ax 13 14 mov bx,16 ;字符属性值首地址 15 mov cx,3 ;三行字符串 16 17 s: mov dx,cx 18 mov si,0 19 mov di,0 20 mov ah,[bx] ;ah=字符属性值 21 inc bx 22 mov cx,16 23 24 s0: mov al,[si] ;al=字符ASCII码 25 mov es:[di],ax 26 inc si 27 add di,2 28 loop s0 29 mov ax,es ;指向下一个字符串 30 add ax,0ah ;每行160个字节,相当于段地址增加10 31 mov es,ax 32 mov cx,dx 33 loop s 34 35 mov ax,4c00h 36 int 21h 37 code ends 38 39 end start