任务要求:自学P188的有关显示显存、显示字符串的学习材料,在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串“welcome  to masm”。

一、分析设计想法

这个题目的本质是循环读取字符,将字符复制到寄存器中并放到指定的显存内存单元中,并控制好字符的属性字节即可,非常有趣,能比较直观的控制显存。

二、程序的设计

 

 

assume cs:codesg

data segment

  db 'welcome to masm!'

data ends

 

 stack segment

  

 stack ends

 

codesg segment

 

start:

     mov ax,data

        mov ds,ax

        mov ax,0B800H

        mov es,ax;将显存的位置放入es

        

        mov cx,16

        mov si,0

        mov di,12*160+64 ;屏幕中央

s0:

     mov al,ds:[si]

        mov ah,00000010B   ;黑底绿色

        mov es:[di],ax ;将数据段的字符放入附加段(即显存中)

        inc si

        add di,2

        loop s0

        

        add di,160-32   ;下一行

        mov si,0

        mov cx,16

        

s1:

     mov al,ds:[si]

        mov ah,00100100B    ;绿底红字

        mov es:[di],ax;将数据段的字符放入附加段(即显存中)

        inc si

        add di,2

        loop s1

        

        add di,160-32   ;下一行

        mov si,0

        mov cx,16

        

s2:

     mov al,ds:[si]

        mov ah,01110001B    ;白底蓝色

        mov es:[di],ax; 将数据段的字符放入附加段(即显存中)

        inc si

        add di,2

        loop s2

        

        mov ax,4c00H

        int 21H

         

  codesg ends

  end start

 

三、程序的结果

四、心得体会

通过自学汇编程序设计有关显示显存、显示字符串的学习材料,我了解了显存在内存地址空间中的位置是B8000H~BFFFFH共32KB的空间,并且知道了如何将字符输出到屏幕中央,举一反三,我可以随心所欲的将我想要输出的内容输出到屏幕上的任何一个地方,并能控制字符颜色,字符背景颜色以及字符是否闪烁和是否高亮,学习了许多新的知识,开扩了自己的眼界。

任务说明:某公司从1975成立一直到1995年的基本情况如下:

年份 收入(千美元) 雇员(人) 人均收入(千美元)
1975 16 3 ?
1976 22 7 ?
1977 382 9 ?
1978 1356 13 ?
1979 2390 28 ?
8000 38 ?
1995 5937000 17800 ?

已知程序中的数据按下面的方式定义:

 

assume cs:codesg,ds:datasg,es:table

datasg segment

 db '1975','1976','1977','1978','1979','1980','1981','1982','1983'

db '1984','1985','1986','1987','1988','1989','1990','1991','1992'

db '1993','1994','1995'

       ;以上是表示21年的21个字符串

 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

 dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000

dd 5937000

           ;以上是公司21年总收入

dw 3,7,9,13,28,38,130,220,476,78,1001,1442,2258,2793,4037,5635,8226

dw 11542,14430,15257,17800

以上表示21年每年雇佣人数

dataend

table segment

           db 21 dup ('year summ ne ?? ')

table ends

 

编程,将data段中的数据按如下格式写入到table段中,并计算21年中的人均收入(取整),结果也按照下面的格式保存在table段中

年份(4字节) 空格 收入(4字节) 空格 雇员数

(2字节)

空格 人均收入(2字节) 空格
行内

地址

1年

1行

每行的始址

0 1 2 3 4 5 6 7 8 9 A B C D E F
Table:0H ‘1975’ 16 3 ?
Table:10H ‘1976’ 22 7 ?
Table:20H ‘1977’ 382 9 ?
Table:30H ‘1978’ 1356 13 ?
Table:40H ‘1979’ 2390 28 ?
…. 8000 38 ?
Table:140H ‘1995’ 5937000 17800 ?

 

一、分析设计想法

这个题目的本质是循环读取字符串,将字符串复制到寄存器中并放到指定的内存单元中,同时用到了除法,只要一步一步稳扎稳打的进行,一般是不会出现错误的。

 

二、程序的设计

 

assume cs:codesg

data segment

  db '1975','1976','1977','1978','1979','1980','1981','1982','1983'

  db '1984','1985','1986','1987','1988','1989','1990','1991','1992'

  db '1993','1994','1995'

  dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514

  dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000

  dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

  dw 11542,14430,15257,17800

 

  data ends

 

 table segment

    db 21 dup ('year summ ne ?? ');首先覆盖掉空的内存单元,方便查看结果

 table ends

 

 stack segment

   dw 0,0,0,0,0,0,0,0;定义堆栈段

 stack ends

 

codesg segment

 

start:

          mov ax,table

          mov es,ax

          mov ax,data

          mov ds,ax

         

          mov bx,0 ;存年份偏移

          mov si,0 ;存人数偏移

          mov di,0 ;存table段中偏移

         

          mov cx,21 ;循环21年

 

       s0:

          ;将数据段中的年份复制到附加段中

          mov ax,[bx]

          mov es:[di],ax

          mov ax,[bx+2]

          mov es:[di+2],ax

         

          ;将数据段中的收入复制到附加段中

          mov ax,[bx+84]

          mov es:[di+5],ax

          mov ax,[bx+86]

          mov es:[di+7],ax

 

       ;将数据段中的人数复制到附加段中

       mov ax,[si+168]

       mov es:[di+10],ax

         

          ;通过除法计算出人均收入

          mov ax,[bx+84];低位

          mov dx,[bx+86];高位

          div word ptr [si+168];商存在ax中

          mov es:[di+13],ax

         

       add bx,4

          add si,2

          add di,16

     loop s0

        

 

  mov ax,4c00H

  int 21H

 
  codesg ends

  end start

 

三、程序的结果

四、心得体会

通过这个大作业程序的设计,我进一步掌握了堆栈段,数据段和附加段的简单使用,并且学会了如何在汇编语言中使用除法,在除法的过程中分别用哪些存储器存储数据,并通过格式化的控制,能够存储较为整齐的数据,在学习汇编语言程序设计的过程中,我常常会遇到自己没有思绪的程序,完全不知道该怎么写,或者按照我思考的样子却写不出我想要的结果,但是慢慢修改,慢慢积累,遇到的坑多了,也就不容易遇到坑了,写不好没关系,哪怕再小的程序,多写多改,慢慢地我就会提高的。