鱼C论坛

 找回密码
 立即注册
查看: 3047|回复: 2

[汇编作业] 课程设计作业

[复制链接]
发表于 2017-6-21 23:36:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:code,ds:data,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'
    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
    dd 345980,590827,803530,1183000,1843000,2795000,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
    dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
    dw 260,304,333
data ends

table segment 
        db 15h dup('year summ ne ?? year summ ne ?? ')
table ends

stack segment
        db 20h dup(0)
stack ends

;stackB segment
;        db 20h dup(0)
;stackB ends

code segment
        start:
                mov ax,data
                mov ds,ax
                mov ax,table
                mov es,ax
                mov ax,stack
                mov ss,ax
                mov sp,20h
                
                
                call putyear
                call putinc
                call putgz
                call PUTMon
                call show_str
                
                mov ax,4c00h
                int 21h
                
                
                
                ;---------处理年份--------
                ;功能:取年份,放到table段每行开头四个字节,结尾加空格
                ;
                ;
                putyear:
                          
                                mov cx,15h  ;21 次循环
                                sub si,si   ;source address.
                                sub bx,bx   ;destionct address .every line 
                                tyoy:                ;Twenty one year
                                  push cx        
                                  sub di,di
                              mov cx,4        ;一个年份4个字符循环4次
                                  sy:
                                   mov al,[si]
                                   mov es:[bx+di],al
                                   inc si
                                   inc di
                                  loop sy
                                          mov al,20h
                                          mov es:[bx+di],al
                                add bx,20h
                                pop cx
                            loop tyoy 
                                
                                
                                mov es:2a0h,si        ;保存当前取到的数据的地址
                                
                                
                ret
                
                putinc:
                                mov si,es:02a0h                ;取原始数据地址
                                sub bx,bx                        ;行数计数,从零开始        
                                mov cx,15h                        ;21行数据循环21次
                                
                                recnum:
                                push cx                                 ;保存外循环计数
                                mov es:2A2h,bx                                ;保存行数计数
                                
                                ;---准备除法传入参数
                                mov bx,[si]                                ;低16位数放bx
                            mov ax,[si+2]                                ;高16位数放ax
                                push si                                                ;保存去数据地址
                                sub si,si                        ;做计数器用,清零
                                divzw:
                                    mov cx,10                ;除数放cx
                                    call divdw
                                    add cx,30h                ;数字转换为ascii码
                                push cx                        ;转换好的数据入栈
                                        inc si                         ;计数入栈次数
                                    mov cx,ax        ;
                                    add cx,dx        ;把商放入cx中
                                    jcxz okk          ;检测为零则跳出
                                        mov bx,ax        ;做过除法后低位放bx
                                        mov ax,dx        ;做过除法后高位放ax
                                jmp short divzw                 ;循环除法直到商为零(即所有数字都转换为ascii)
                                okk:        
                                     mov bx,es:2a2h
                                     mov di,05h                    ;每一行的写入偏移量
                                           mov cx,si                ;入栈次数作为循环条件放cx
                                           putnu:
                                             pop es:[bx+di]                ;依次将转换好的数据写入
                                             inc di                                ;
                                           loop putnu
                                           
                                          mov cx,8                        ;----不够8位字节以空格补足8位---
                                          sub cx,si
                                          adspp: 
                                              mov al,20h                        ;
                                              mov es:[bx+di],al                ;在一个数末尾加一个空格
                                                  inc di
                                          loop adspp
                                     add bx,20h                                ;写入下一行的行地址
                                
                                        
                                  pop si                                        ;还原取数据地址          
                                  add si,4                                        ;下一个取数地址
                                    
                                  
                                  pop cx                                        ;还原外循环计数
                                loop recnum
                                
                                mov es:2a0h,si                   ;保存当前取到数据的地址
                ret
                
                PUTGZ:
                                mov si,es:02a0h                ;取原始数据地址
                                sub bx,bx                        ;行数计数,从零开始        
                                mov cx,15h                        ;21行要放入的数据循环21次
                                
                                renum:
                                push cx                                 ;保存外循环计数
                                mov es:2A2h,bx                                ;保存行数计数
                                
                                ;---准备除法传入参数
                                mov ax,[si]                              ;被除数
                           
                                push si                                        ;保存取数据地址
                                sub si,si
                                ;sub bx,bx                        ;做计数器用,清零
                                divl:
                                        mov dx,0                ;字除法,高位字置零
                                    mov cx,10                ;除数放cx
                                    div cx                        ;商在ax,余数在dx
                                    add dx,30h                ;数字转换为ascii码
                                push dx                        ;转换好的数据入栈
                                        inc si                         ;计数入栈次数
                                    mov cx,ax        ;
                                    ;add cx,dx        ;把商放入cx中
                                    jcxz ok          ;检测为零则跳出
                                        ;mov bx,ax        ;做过除法后低位放bx
                                        ;mov ax,dx        ;做过除法后高位放ax
                                jmp short divl                 ;循环除法直到商为零(即所有数字都转换为ascii)
                                ok:        
                                     mov bx,es:2a2h
                                     mov di,0dh                    ;每一行的写入偏移量
                                           mov cx,si                ;入栈次数作为循环条件放cx
                                           putn:
                                             pop es:[bx+di]                ;依次将转换好的数据写入
                                             inc di                                ;
                                           loop putn
                                           
                                          mov cx,8                        ;----不够5位字节以空格补足5位---
                                          sub cx,si
                                          adsp: 
                                              mov al,20h                        ;
                                              mov es:[bx+di],al                ;在一个数末尾加一个空格
                                                  inc di
                                          loop adsp
                                     add bx,20h                                ;写入下一行的行地址
                                
                                        
                                  pop si                                        ;还原取数据地址          
                                  add si,2                                        ;下一个取数地址
                                    
                                  
                                  pop cx                                        ;还原外循环计数
                                loop renum
                                
                                mov es:2a0h,si                   ;保存当前取到数据的地址
                ret
                
                        PUTMon:
                                mov si,es:02a0h                ;取原始数据地址
                                sub bx,bx                        ;行数计数,从零开始        
                                mov cx,15h                        ;21行要放入的数据循环21次
                                
                                renumb:
                                push cx                                 ;保存外循环计数
                                mov es:2A2h,bx                                ;保存行数计数
                                
                                ;---准备除法传入参数
                                mov ax,[si]                              ;被除数
                           
                                push si                                        ;保存取数据地址
                                sub si,si
                                ;sub bx,bx                        ;做计数器用,清零
                                divll:
                                        mov dx,0                ;字除法,高位字置零
                                    mov cx,10                ;除数放cx
                                    div cx                        ;商在ax,余数在dx
                                    add dx,30h                ;数字转换为ascii码
                                push dx                        ;转换好的数据入栈
                                        inc si                         ;计数入栈次数
                                    mov cx,ax        ;
                                    ;add cx,dx        ;把商放入cx中
                                    jcxz okkk          ;检测为零则跳出
                                        ;mov bx,ax        ;做过除法后低位放bx
                                        ;mov ax,dx        ;做过除法后高位放ax
                                jmp short divll                 ;循环除法直到商为零(即所有数字都转换为ascii)
                                okkk:        
                                     mov bx,es:2a2h
                                     mov di,015h                    ;每一行的写入偏移量
                                           mov cx,si                ;入栈次数作为循环条件放cx
                                           putnn:
                                             pop es:[bx+di]                ;依次将转换好的数据写入
                                             inc di                                ;
                                           loop putnn
                                           
                                          mov cx,4                        ;----不够4位字节以空格补足5位---
                                          sub cx,si
                                          adsppp: 
                                              mov al,20h                        ;
                                              mov es:[bx+di],al                ;在一个数末尾加一个空格
                                                  inc di
                                                  loop adsppp
                                                  mov al,0                                ;每行末尾加0
                                                  mov es:[bx+di],al
                                     add bx,20h                                ;写入下一行的行地址
                                
                                        
                                  pop si                                        ;还原取数据地址          
                                  add si,2                                        ;下一个取数地址
                                    
                                  
                                  pop cx                                        ;还原外循环计数
                                loop renumb
                                
                                mov es:2a0h,si                   ;保存当前取到数据的地址
                ret
                
                divdw:        ;---双字除法---
                                ;参  数:除数放cx,高16位数放ax,低16位数放bx
                                ;返回值:高位商放dx,低位商放ax,余数放cx
                        push bx                                ;不用作返回参数的寄存器保持原状
                        
                        sub dx,dx                        ;字除法dx会参与,将dx置零
                        div cx                                ;div后,商在ax,余数在dx
                        push ax                                ;保存高位除法的商
                        
                        mov ax,bx
                        div cx                                ;做低位除法--相当于[mod(H/N)X10000h+L]/0Ah
                        mov cx,dx                        ;余数放cx
                        pop dx                                ;高位除法商放dx
                        
                        pop bx                                ;;不用作返回参数的寄存器恢复原状
                ret
                
                show_str:
                call cls
                push ds
                        mov ax,0b800h     ;
                        mov ds,ax
                        sub si,si
                        sub di,di
                        
                        
                        sub bx,bx
                        sub dx,dx
                        mov cx,15h
                        showall:
                                push cx
                                showln:
                                    
                                
                                mov al,es:[si]
                                mov ah,02
                                mov 28[bx+di],al
                                mov 29[bx+di],ah
                                inc si
                                inc di
                                inc di
                                mov ah,0
                                mov cx,ax
                                jcxz over
                                jmp showln
                            over:
                                mov ax,0a0h
                                inc dx
                                push dx
                                push dx
                                mul dx
                                mov bx,ax
                                mov cx,20h
                                pop dx
                                mov ax,dx
                                mul cx
                                ;add ax,ax
                                mov si,ax
                                
                                sub di,di
                                pop dx
                           pop cx
                        loop showall
                pop ds
                ret
                cls:
                   push ax
                   push cx
                   push es
                   push si
                   mov cx,3840
                   mov ax,0b800h
                   mov es,ax
                   sub si,si
                   sc:mov ax,0
                     mov es:[si],ax
                     inc si
                         loop sc
                   pop si
                   pop es
                   pop cx
                   pop ax
                ret
        
                
                
code ends
end start

真是好麻烦啊!费大功夫了

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-6-21 23:37:59 | 显示全部楼层
逼的我想搞两个栈出来,结果更是弄不成
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-19 21:58:10 | 显示全部楼层
erh 发表于 2017-6-21 23:37
逼的我想搞两个栈出来,结果更是弄不成

你可以看看我的,用数据段保存http://bbs.fishc.com/thread-101723-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 20:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表