| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
编写程序为王爽老师的《汇编语言》第211页课程设计一 
编写工具 Notepa++ 
编译环境 XP虚拟机 
编译工具 masm5.0 
问题代码 设计1.zip 
 
源代码: 
assume cs:code,ds:data,es:table 
 
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 11452,14430,15257,17800 
data ends 
 
table segment 
    db 21 dup ('year summ ne ?? ') 
table ends 
 
fruit segment 
    db 32 dup(0) 
fruit ends 
 
code segment  
     
 
;初始化阶段  
;将原始数据整理放到table处 
;套用实验七的程序加以修改 
 
start:        mov ax,data 
            mov ds,ax 
            mov ax,table 
            mov es,ax 
            mov si,0 
            mov bx,0 
            mov di,0 
            mov cx,21 
s0:            mov ax,[bx]                 
            mov es:[si],ax 
            mov ax,[bx+2]             
            mov es:[si+2],ax     
             
            mov ax,[bx+84] 
            mov es:[si+5],ax 
            mov dx,[bx+86] 
            mov es:[si+7],dx 
             
            div word ptr [168+di] 
            mov es:[si+13],ax 
             
            mov ax,[168+di] 
            mov es:[si+10],ax 
             
            add di,2 
            add si,10h 
            add bx,4 
            loop s0 
             
             
;准备阶段 
;将数据转换为ASC码格式 
;存储在fruit段 
 
            mov ax,table 
            mov ds,ax                 
            mov dh,3                ;dh代表行号(0~24) 
            mov dl,3                ;dl代表列号(0~79) 
            mov al,160 
            mul dh                    ;相乘得出行地址存在ax 
            mov bx,ax                ;ax后面用到,转移到bx 
            mov al,2 
            mul dl                    ;相乘得出列地址存在ax 
            add bx,ax                ;行列相加得到真正地址,存放在bx 
            mov bp,0 
            mov cx,21 
             
             
s1:            push cx 
            push bx 
            mov ax,fruit  
            mov es,ax 
            mov si,0 
            mov di,0 
            mov ax,0 
            mov dx,0 
             
            mov ax,ds:[bp+di]        ;将年份放进目标段  
            mov es:[si],ax 
            mov ax,ds:[bp+di].2 
            mov es:[si].2,ax     
            add si,6 
            add di,5 
             
             
            mov ax,ds:[bp+di]        ;将总金额放进目标段  
            mov dx,ds:[bp+di].2     
            call dtoc 
            add si,10 
            add di,5 
             
            mov ax,ds:[bp+di]        ;将人数放进目标段  
            mov dx,0 
            call dtoc 
            add si,6 
            add di,3 
             
            mov ax,ds:[bp+di]        ;将人均金额放进目标段  
            mov dx,0 
            call dtoc 
             
             
;打印输出阶段             
             
            mov ax,fruit            ;段地址切换 
            mov ds,ax 
            mov ax,0b800h 
            mov es,ax 
             
            mov si,0                ;循环实现0转换为空格,并以0结尾 
            mov cx,29 
a:            push cx 
            mov cl,[si]             
            jcxz b 
c:            inc si 
            pop cx 
            loop a 
            mov byte ptr [si],0 
b:            mov byte ptr [si],20h     
            jmp shor c 
             
             
            mov si,0 
            call show_str 
             
             
             
             
            pop bx 
            pop cx 
            add bx,0a0h                ;转移到下一行显存 
            add bp,0ah                ;table段切换到下一行 
            loop s1 
 
            mov ax,4c00h 
            int 21h 
 
             
             
             
             
 
dtoc:        push ax 
            push bx 
            push cx 
            push dx 
            push si 
            push di 
            mov di,0 
            mov cx,ax 
            jcxz short s3            ;低位为0,跳转到s3判断 
            mov cx,0ah 
s2:            call divdw                ;引用实验十(2)除法模块 
            add cx,30h 
            push cx             
            inc di 
            jmp short dtoc 
s3:            mov cx,dx 
            jcxz s4                    ;高低位均位0,结束 
            jmp short s2  
s4:            mov cx,di 
s5:            pop ax 
            mov es:[si],al 
            inc si 
            loop s5 
            pop    di 
            pop si 
            pop dx 
            pop cx 
            pop bx 
            pop ax 
            ret 
     
     
;名称:divdw 
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。 
;参数:(ax)=dword型数据的低16位; 
;      (dx)=dword型数据的高16位; 
;      (cx)=除数。 
;返回:(dx)=结果的高16位; 
;      (ax)=结果的低16位; 
;      (cx)=余数。     
         
divdw:        push di 
            push ax                ;ax后面做除法要用到,暂存到栈 
            mov ax,dx             
            mov dx,0            ;被除数高位为0,低位为H 
            div cx 
            mov di,ax            ;商暂存 
            pop ax                ;取出L,此时高位为H/N的余数,低位为L 
            div cx 
            mov cx,dx            ;余数 
            mov dx,di            ;商高位 
            pop di 
            ret     
             
     
show_str:    mov al,2 
            mov ch,0 
             
d1:            mov cl,[si] 
            jcxz q 
            mov dl,ds:[si] 
            mov es:[bx],dl            ;字符 
            mov es:[bx].1,al        ;颜色 
            inc si                    ;存放顺序为倒序,自减一 
            add bx,2 
 
            loop d1 
q:            ret                     
             
             
         
 
code ends 
 
end start     
 
 
 
- assume cs:code,ds:data,es:table
 
  
- 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 11452,14430,15257,17800
 
 - data ends
 
  
- table segment
 
 -     db 21 dup ('year summ ne ?? ')
 
 - table ends
 
  
- fruit segment
 
 -         db 32 dup(0)
 
 - fruit ends
 
  
- code segment 
 
 -         
 
  
- ;初始化阶段 
 
 - ;将原始数据整理放到table处
 
 - ;套用实验七的程序加以修改
 
  
- start:                mov ax,data
 
 -                         mov ds,ax
 
 -                         mov ax,table
 
 -                         mov es,ax
 
 -                         mov si,0
 
 -                         mov bx,0
 
 -                         mov di,0
 
 -                         mov cx,21
 
 - s0:                        mov ax,[bx]                                
 
 -                         mov es:[si],ax
 
 -                         mov ax,[bx+2]                        
 
 -                         mov es:[si+2],ax        
 
 -                         
 
 -                         mov ax,[bx+84]
 
 -                         mov es:[si+5],ax
 
 -                         mov dx,[bx+86]
 
 -                         mov es:[si+7],dx
 
 -                         
 
 -                         div word ptr [168+di]
 
 -                         mov es:[si+13],ax
 
 -                         
 
 -                         mov ax,[168+di]
 
 -                         mov es:[si+10],ax
 
 -                         
 
 -                         add di,2
 
 -                         add si,10h
 
 -                         add bx,4
 
 -                         loop s0
 
 -                         
 
 -                         
 
 - ;准备阶段
 
 - ;将数据转换为ASC码格式
 
 - ;存储在fruit段
 
  
-                         mov ax,table
 
 -                         mov ds,ax                                
 
 -                         mov dh,3                                ;dh代表行号(0~24)
 
 -                         mov dl,3                                ;dl代表列号(0~79)
 
 -                         mov al,160
 
 -                         mul dh                                        ;相乘得出行地址存在ax
 
 -                         mov bx,ax                                ;ax后面用到,转移到bx
 
 -                         mov al,2
 
 -                         mul dl                                        ;相乘得出列地址存在ax
 
 -                         add bx,ax                                ;行列相加得到真正地址,存放在bx
 
 -                         mov bp,0
 
 -                         mov cx,21
 
 -                         
 
 -                         
 
 - s1:                        push cx
 
 -                         push bx
 
 -                         mov ax,fruit 
 
 -                         mov es,ax
 
 -                         mov si,0
 
 -                         mov di,0
 
 -                         mov ax,0
 
 -                         mov dx,0
 
 -                         
 
 -                         mov ax,ds:[bp+di]                ;将年份放进目标段 
 
 -                         mov es:[si],ax
 
 -                         ;mov ax,ds:[bp+di].2 ;  我没有见过这种写法
 
 -                         ;mov es:[si].2,ax        
 
 -                         add si,6
 
 -                         add di,5
 
 -                         
 
 -                         
 
 -                         mov ax,ds:[bp+di]                ;将总金额放进目标段 
 
 -                         ;mov dx,ds:[bp+di].2        
 
 -                         call dtoc
 
 -                         add si,10
 
 -                         add di,5
 
 -                         
 
 -                         mov ax,ds:[bp+di]                ;将人数放进目标段 
 
 -                         mov dx,0
 
 -                         call dtoc
 
 -                         add si,6
 
 -                         add di,3
 
 -                         
 
 -                         mov ax,ds:[bp+di]                ;将人均金额放进目标段 
 
 -                         mov dx,0
 
 -                         call dtoc
 
 -                         
 
 -                         
 
 - ;打印输出阶段                        
 
 -                         
 
 -                         mov ax,fruit                        ;段地址切换
 
 -                         mov ds,ax
 
 -                         mov ax,0b800h
 
 -                         mov es,ax
 
 -                         
 
 -                         mov si,0                                ;循环实现0转换为空格,并以0结尾
 
 -                         mov cx,29
 
 - a:                        push cx
 
 -                         mov cl,[si]                        
 
 -                         jcxz b
 
 - ;不要用标号c                        
 
 - c1:                        inc si
 
 -                         pop cx
 
 -                         loop a
 
 -                         mov byte ptr [si],0
 
 - b:                        mov byte ptr [si],20h        
 
 -                         jmp short c1
 
 -                         
 
 -                         
 
 -                         mov si,0
 
 -                         call show_str
 
 -                         
 
 -                         
 
 -                         
 
 -                         
 
 -                         pop bx
 
 -                         pop cx
 
 -                         add bx,0a0h                                ;转移到下一行显存
 
 -                         add bp,0ah                                ;table段切换到下一行
 
 -                         loop s1
 
  
-                         mov ax,4c00h
 
 -                         int 21h
 
  
-                         
 
 -                         
 
 -                         
 
 -                         
 
  
- dtoc:                push ax
 
 -                         push bx
 
 -                         push cx
 
 -                         push dx
 
 -                         push si
 
 -                         push di
 
 -                         mov di,0
 
 -                         mov cx,ax
 
 -                         jcxz short s3                        ;低位为0,跳转到s3判断
 
 -                         mov cx,0ah
 
 - s2:                        call divdw                                ;引用实验十(2)除法模块
 
 -                         add cx,30h
 
 -                         push cx                        
 
 -                         inc di
 
 -                         jmp short dtoc
 
 - s3:                        mov cx,dx
 
 -                         jcxz s4                                        ;高低位均位0,结束
 
 -                         jmp short s2 
 
 - s4:                        mov cx,di
 
 - s5:                        pop ax
 
 -                         mov es:[si],al
 
 -                         inc si
 
 -                         loop s5
 
 -                         pop        di
 
 -                         pop si
 
 -                         pop dx
 
 -                         pop cx
 
 -                         pop bx
 
 -                         pop ax
 
 -                         ret
 
 -         
 
 -         
 
 - ;名称:divdw
 
 - ;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
 
 - ;参数:(ax)=dword型数据的低16位;
 
 - ;      (dx)=dword型数据的高16位;
 
 - ;      (cx)=除数。
 
 - ;返回:(dx)=结果的高16位;
 
 - ;      (ax)=结果的低16位;
 
 - ;      (cx)=余数。        
 
 -                 
 
 - divdw:                push di
 
 -                         push ax                                ;ax后面做除法要用到,暂存到栈
 
 -                         mov ax,dx                        
 
 -                         mov dx,0                        ;被除数高位为0,低位为H
 
 -                         div cx
 
 -                         mov di,ax                        ;商暂存
 
 -                         pop ax                                ;取出L,此时高位为H/N的余数,低位为L
 
 -                         div cx
 
 -                         mov cx,dx                        ;余数
 
 -                         mov dx,di                        ;商高位
 
 -                         pop di
 
 -                         ret        
 
 -                         
 
 -         
 
 - show_str:        mov al,2
 
 -                         mov ch,0
 
 -                         
 
 - d1:                        mov cl,[si]
 
 -                         jcxz q
 
 -                         mov dl,ds:[si]
 
 -                         mov es:[bx],dl                        ;字符
 
 -                         ;mov es:[bx].1,al                ;颜色
 
 -                         inc si                                        ;存放顺序为倒序,自减一
 
 -                         add bx,2
 
  
-                         loop d1
 
 - q:                        ret                                        
 
 -                         
 
 -                         
 
 -                 
 
  
- code ends
 
  
- end start        
 
 
  复制代码 
 
 
 |   
 
 
 
 |