计算平均收入并以表格形式输出《汇编语言》课程设计1

在整个课程中,我们一共有两个课程设计,编写两个比较综合的程序,这是第一个

任务:将实验7中的Power idea公司的数据按图10.2所示的格式在屏幕上显示出来。

assume cs:code,ds:data

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

summ segment
  
  db 21 dup (32,32,32,32,32,32,32)

summ ends

ne segment
  
  db 21 dup (32,32,32,32,32)  ;雇员数

ne ends

average segment

  db 21 dup (32,32,32)

average ends

code segment

start:  mov ax,data
        mov ds,ax
 
        mov ax,table
        mov es,ax

    mov si,0  ;初始化
        mov bx,0
    mov bp,0
        mov di,0
    mov cx,21  ;循环21次
 
    s0: mov ax,ds:[di]
        mov es:[si].0,ax
    add di,2
    mov ax,ds:[di]
    mov es:[si].2,ax
    add di,2

        mov ax,ds:54h[bp]
        mov es:[si].5,ax
    add bp,2
        mov dx,ds:54h[bp]
        mov es:[si].7,dx
    add bp,2
    
        mov ax,ds:0a8h[bx]
        mov es:[si].0ah,ax
        
        mov ax,ds:54h[bp].-4
    div word ptr ds:0a8h[bx]
    mov es:[si].0dh,ax
 
    add bx,2
    add si,10h
        loop s0  ;完成对数据的处理

    mov bx,table  ;先处理雇员数,并将数据放入ne段(从table获取数据)
    mov ds,bx  ;存入ds
    
    mov bx,ne  ;将雇员数的段地址赋值给es
    mov es,bx
    mov si,0ah  ;雇员数在table段的偏移地址(每一行的0ah开始)同时表示第几行
    mov bp,0  ;bp代表ne段中每个数据的偏移地址(用于存放时偏移)
    mov cx,21  ;循环21次
  s4:   call dtoc  ;处理雇员数  
    add si,10h  ;将si递增至下一行
    add bp,5  ;将雇员数据存入ne段下一个单位中
    loop s4

    mov bx,average  ;人均收入
    mov es,bx
    mov si,0dh
    mov bp,0
    mov cx,21
  s5:   call dtoc  ;处理人均收入
    add si,10h
    add bp,3
    loop s5

    mov bx,summ
    mov es,bx
    mov si,05h
    mov bp,0
    mov cx,21
  s6:   call ddtoc  ;处理收入
    add si,10h
    add bp,7
    loop s6


  show: 
    mov bx,0a0h
    mov ax,0b800h
    mov es,ax  ;显存段地址
    mov al,7h ;ax=0cah(显示属性)
    mov di,0
    mov cx,21
  showp:  ;处理空格
    push cx
    

    mov di,0
    mov cx,3
    call s_p
    
    mov di,14
    mov cx,6
    call s_p

    mov di,36
    mov cx,5
    call s_p

    mov di,56
    mov cx,6
    call s_p

    mov di,74
    mov cx,43
    call s_p

    add bx,0a0h
    pop cx
    loop showp

  show_year:
    mov ax,table
    mov ds,ax
    mov di,6  ;在屏幕上第三列开始显示
    mov si,0
    mov bx,0a0h
    mov al,7h ;显示属性
    mov cx,21
  show1:    call show_y
    add si,10h
    add bx,0a0h
    loop show1

  show_summ:mov ax,summ  ;显示summ段数据
    mov ds,ax
    mov di,24  ;在屏幕上第12列开始显示
    mov si,0  ;指向数据段第一个数据
    mov bx,0a0h  ;第一行
    mov al,7h  ;显示属性
    mov cx,21  ;循环21行
  show_s:
    push cx
    mov cx,7
    call show_str
    add si,7
    add bx,0a0h
    pop cx
    loop show_s

  show_ne:
    mov ax,ne
    mov ds,ax
    mov di,46  ;从屏幕第23列开始显示
    mov si,0
    mov bx,0a0h
    mov al,7h
    mov cx,21
  show_n:
    push cx
    mov cx,5
    call show_str
    add si,5
    add bx,0a0h
    pop cx
    loop show_n

  show_average:
    mov ax,average
    mov ds,ax
    mov di,68
    mov si,0
    mov bx,0a0h
    mov al,7h
    mov cx,21
  show_a:
    push cx
    mov cx,3
    call show_str
    add si,3
    add bx,0a0h
    pop cx
    loop show_a



    mov ax,4c00h
    int 21h
  ddtoc:
    push dx
    push cx
    push ax
    push si
    push bx
    push bp

    mov ax,[si]  ;存储低16位
    mov dx,[si+2]  ;存储高16位
    mov bx,0
  s2_1:mov cx,10d  ;除数为10
    call divdw  ;除
    add cx,30h  ;cx存储余数,加30后入栈
    push cx
    mov cx,ax  ;这里可能有问题
    jcxz s2_2
    inc bx
    jmp short s2_1

  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

  s2_2:inc bx
    mov cx,bx  ;将位数传给cx,用于s3循环
    ;mov si,0

  s2_3: pop ax
    mov es:[bp],al
    inc bp
    loop s2_3

  okay2:
    pop bp
    pop bx
    pop si
    pop ax
    pop cx
    pop dx
    ret

  dtoc:
    push dx  ;保存各个寄存器中的数据
    push cx
    push ax
    push si
    push bx
    push bp
    
    
    mov ax,ds:[si]  ;将table段中的雇员数存入ax
    mov bx,0
  s1:   mov cx,10d
    mov dx,0
    div cx  ;将ax/10d
    mov cx,ax  ;商,dx存储余数
    jcxz s2  ;当商为0,是则跳转s2
    add  dx,30h  ;当商不为0,则继续进行,加30h
    push dx  ;入栈
    inc bx  ;递增bx(bx)记录位数
    jmp short s1  ;循环s1

  s2:   add dx,30h  ;将余数加30h
    push dx  ;入栈
    inc bx  ;递增bx
    mov cx,bx  ;将位数传给cx,用于s3循环
    ;mov si,0  ;重置si,并继续向下执行

  s3:   pop ax  ;将ax出栈
    mov es:[bp],al  ;把al的值传入ne段(bp为字符段的偏移地址)
    inc bp
    loop s3
        ;循环结束后向下执行okay段代码
  okay:
    pop bp
    pop bx  ;出栈
    pop si
    pop ax
    pop cx
    pop dx
    ret  ;回到87行

  show_str:
    push si
    push di

  s:    mov ah,ds:[si]  ;先放入ah
    mov es:[bx+di],ah  ;将数值放入显存
    mov es:[bx+di+1],al  ;放入属性
    inc si
    add di,2  ;显存中的偏移值
    loop s

    pop di
    pop si
    ret

  show_y:push cx
    push si
    push di



    mov cx,4
  sy:   mov ah,ds:[si]
    mov es:[bx+di],ah
    mov es:[bx+di+1],al
    inc si
    add di,2
    loop sy

    pop di
    pop si
    pop cx
    ret


  s_p:
    mov ah,32
    mov es:[bx+di],ah
    mov es:[bx+di+1],al
    add di,2
    dec cx
    jcxz ok2
    jmp short s_p

  ok2:
    ret

code ends

end start

说点什么

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒