王爽汇编语言课程设计1

一、实验要求
在屏幕输出实验七中的数据
二、设计思路
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年公司总收入的21个dword型数据

       dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
       dw 11542,14430,15257,17800
       ;以上是表示21年公司雇员人数的21个word型数据
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行,循环21s:
      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

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值