汇编实验(材料编程)

这是书中的实验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

你可能感兴趣的:(编程)