王爽汇编语言课程设计1

来源:互联网 发布:星际之门 知乎 编辑:程序博客网 时间:2024/05/08 15:11

一、实验要求

在屏幕输出实验七中的数据

二、设计思路

1、将实验七的程序编写成一个子过程finishing,在主程序中调用,可以获得实验七种指定格式的table段数据,设置es:bx指向table段中第一行

2、创建一个数据缓存区buffer,设置ds:si指向buffer

3、对于字符串,从table中读取后写入buffer,末尾写入0;对于数值,直接调用实验10中写好的dtoc转换到buffer中

4、每次更新buffer中数据后调用实验10中的show_str来显示字符串

三、详细设计

assume cs:codesg,ss:stack

 

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'

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

      

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

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

       ;以上是表示21年公司总收入的21dword型数据

      

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

       dw 11542,14430,15257,17800

       ;以上是表示21年公司雇员人数的21word型数据

data ends

 

table segment

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

table ends

 

stack segment

       dw 32 dup (0)

stack ends

 

buffer segment

       db 32 dup (0)

buffer ends

 

codesg segment

start:

       mov ax,data

       mov ds,ax

       mov di,0

       mov si,4*21+4*21

      

       mov ax,table

       mov es,ax

       mov bx,0

       call finishing

      

       mov ax,stack

       mov ss,ax

       mov sp,64

      

       mov ax,buffer ;定义一个数据缓冲区,用于接收转换后的每个字符串,用ds:si指向缓冲区

       mov ds,ax

       mov si,0

       mov ax,table   ;定义指向填充后table的指针,用es:bx指向table

       mov es,ax

       mov bx,0

       mov dh,5        ;控制第一条数据在哪一行

      

       mov cx,21      ;总数据有21行,循环21

  s:

      push cx

     

      mov ax,es:[bx]              ;buffer中写入一条年信息

      mov ds:[si],ax

      mov ax,es:[bx+2]

      mov ds:[si+2],ax

      mov byte ptr ds:[si+4],0

      mov dl,20              ;显示字符串

      mov cl,2

      call show_str

     

      push dx

      mov ax,es:[bx+5]   ;读取一条总收入信息

      mov dx,es:[bx+7]

      call dtoc                ;调用dtoc将数值转换成字符串到buffer

      pop dx

      mov dl,30              ;显示字符串

      call show_str

     

      push dx

      mov ax,es:[bx+0ah]       ;读取一条总人数信息

      mov dx,0

      call dtoc         ;调用dtoc将数值转换成字符串到buffer

      pop dx

      mov dl,40       ;显示字符串

      call show_str 

     

      push dx

      mov ax,es:[bx+0dh]       ;读取一条人均收入信息

      mov dx,0

      call dtoc         ;调用dtoc将数值转换成字符串到buffer

      pop dx

      mov dl,50       ;显示字符串

      call show_str

     

      add dh,2         ;每隔一行打印一条数据

      add bx,10h     ;es:bx指向table的下一行数据

     

      pop cx

      loop s

      

       mov ax,4c00h

       int 21h

      

show_str:

       push ax   ;保存调用前寄存器环境

       push bx

       push cx

       push dx

       push es

       push bp

       push si

      

       mov ax,0b800h

       mov es,ax

       mov al,80*2

       mul dh

       mov dh,0

       add ax,dx

       add ax,dx

       mov bp,ax

       mov al,cl

       mov cx,0

       mov cl,ds:[si]

       inc si

  show_str_s:     

       mov es:[bp],cl

       inc bp

       mov es:[bp],al

       inc bp

       mov cl,ds:[si]   ;每次将一个字节的数据读入cl中,如果这个字节为0,循环结束

       inc si

       inc cx

       loop show_str_s

      

       pop si  ;恢复调用前寄存器环境

       pop bp

       pop es

       pop dx

       pop cx

       pop bx

       pop ax

       ret

      

dtoc:

       push ax

       push bx

       push cx

       push dx

       push bp

       push si

 

       mov bp,0

  dtoc_s0:

       mov cx,10d

       call divdw

       push cx

       inc bp

       mov cx,ax

       inc cx

       loop dtoc_s0

 

       mov cx,bp

  dtoc_s:

       pop bx

       add bl,30h

       mov ds:[si],bl

       inc si

       loop dtoc_s

 

       mov byte ptr ds:[si],0

 

       pop si

       pop bp

       pop dx

       pop cx

       pop bx

       pop ax

       ret

      

      

divdw:  ;子程序定义开始

       push bx

      

       push ax

       mov ax,dx

       mov dx,0

       div cx

       mov bx,ax

       pop ax

       div cx

       mov cx,dx

       mov dx,bx

 

       pop bx

       ret

 

     

     

finishing:

       push ax

       push bx

       push cx

       push di

       push si

       push bp

      

       mov cx,21

  finishing_s:

      ;填充时间

      mov ax,ds:[di]

      mov es:[bx],ax

      mov ax,ds:[di+2]

      mov es:[bx+2],ax

     

      ;填充收入

      mov ax,ds:[di+4*21]

      mov dx,ds:[di+4*21+2]

      mov es:[bx+5],ax

      mov es:[bx+5+2],dx

     

      ;填充人数

      mov bp,ds:[si]

      mov es:[bx+0ah],bp

     

      ;填充人均收入

      div bp

      mov es:[bx+0dh],ax

           

       add bx,16

       add di,4

       add si,2

       loop finishing_s

      

       pop bp

       pop si

       pop di

       pop cx

       pop bx

       pop ax

       ret

 

codesg ends

end start

 

 

 

四、实验结果

 

 

 

原创粉丝点击