erh 发表于 2017-6-21 23:36:44

课程设计作业

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,
                                   mov es:,al
                                   inc si
                                   inc di
                                loop sy
                                          mov al,20h
                                          mov es:,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,                                ;低16位数放bx
                          mov ax,                                ;高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:                ;依次将转换好的数据写入
                                             inc di                                ;
                                           loop putnu
                                          
                                          mov cx,8                        ;----不够8位字节以空格补足8位---
                                          sub cx,si
                                          adspp:
                                              mov al,20h                        ;
                                              mov es:,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,                              ;被除数
                          
                                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:                ;依次将转换好的数据写入
                                             inc di                                ;
                                           loop putn
                                          
                                          mov cx,8                        ;----不够5位字节以空格补足5位---
                                          sub cx,si
                                          adsp:
                                              mov al,20h                        ;
                                              mov es:,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,                              ;被除数
                          
                                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:                ;依次将转换好的数据写入
                                             inc di                                ;
                                           loop putnn
                                          
                                          mov cx,4                        ;----不够4位字节以空格补足5位---
                                          sub cx,si
                                          adsppp:
                                              mov al,20h                        ;
                                              mov es:,al                ;在一个数末尾加一个空格
                                                  inc di
                                                  loop adsppp
                                                  mov al,0                                ;每行末尾加0
                                                  mov es:,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                                ;做低位除法--相当于/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:
                                mov ah,02
                                mov 28,al
                                mov 29,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:,ax
                     inc si
                       loop sc
                   pop si
                   pop es
                   pop cx
                   pop ax
                ret
       
               
               
code ends
end start


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

erh 发表于 2017-6-21 23:37:59

逼的我想搞两个栈出来,结果更是弄不成{:10_251:}

90182si 发表于 2017-12-19 21:58:10

erh 发表于 2017-6-21 23:37
逼的我想搞两个栈出来,结果更是弄不成

你可以看看我的,用数据段保存http://bbs.fishc.com/thread-101723-1-1.html
页: [1]
查看完整版本: 课程设计作业