鱼C论坛

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

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

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

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

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

x
  1. assume cs:code,ds:data,ss:stack

  2. data segment
  3.         db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  4.     db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  5.     db '1993','1994','1995'
  6.     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  7.     dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000
  8.     dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  9.     dw 11542,14430,15257,17800
  10.     dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239
  11.     dw 260,304,333
  12. data ends

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

  16. stack segment
  17.         db 20h dup(0)
  18. stack ends

  19. ;stackB segment
  20. ;        db 20h dup(0)
  21. ;stackB ends

  22. code segment
  23.         start:
  24.                 mov ax,data
  25.                 mov ds,ax
  26.                 mov ax,table
  27.                 mov es,ax
  28.                 mov ax,stack
  29.                 mov ss,ax
  30.                 mov sp,20h
  31.                
  32.                
  33.                 call putyear
  34.                 call putinc
  35.                 call putgz
  36.                 call PUTMon
  37.                 call show_str
  38.                
  39.                 mov ax,4c00h
  40.                 int 21h
  41.                
  42.                
  43.                
  44.                 ;---------处理年份--------
  45.                 ;功能:取年份,放到table段每行开头四个字节,结尾加空格
  46.                 ;
  47.                 ;
  48.                 putyear:
  49.                           
  50.                                 mov cx,15h  ;21 次循环
  51.                                 sub si,si   ;source address.
  52.                                 sub bx,bx   ;destionct address .every line
  53.                                 tyoy:                ;Twenty one year
  54.                                   push cx       
  55.                                   sub di,di
  56.                               mov cx,4        ;一个年份4个字符循环4次
  57.                                   sy:
  58.                                    mov al,[si]
  59.                                    mov es:[bx+di],al
  60.                                    inc si
  61.                                    inc di
  62.                                   loop sy
  63.                                           mov al,20h
  64.                                           mov es:[bx+di],al
  65.                                 add bx,20h
  66.                                 pop cx
  67.                             loop tyoy
  68.                                
  69.                                
  70.                                 mov es:2a0h,si        ;保存当前取到的数据的地址
  71.                                
  72.                                
  73.                 ret
  74.                
  75.                 putinc:
  76.                                 mov si,es:02a0h                ;取原始数据地址
  77.                                 sub bx,bx                        ;行数计数,从零开始       
  78.                                 mov cx,15h                        ;21行数据循环21次
  79.                                
  80.                                 recnum:
  81.                                 push cx                                 ;保存外循环计数
  82.                                 mov es:2A2h,bx                                ;保存行数计数
  83.                                
  84.                                 ;---准备除法传入参数
  85.                                 mov bx,[si]                                ;低16位数放bx
  86.                             mov ax,[si+2]                                ;高16位数放ax
  87.                                 push si                                                ;保存去数据地址
  88.                                 sub si,si                        ;做计数器用,清零
  89.                                 divzw:
  90.                                     mov cx,10                ;除数放cx
  91.                                     call divdw
  92.                                     add cx,30h                ;数字转换为ascii码
  93.                                 push cx                        ;转换好的数据入栈
  94.                                         inc si                         ;计数入栈次数
  95.                                     mov cx,ax        ;
  96.                                     add cx,dx        ;把商放入cx中
  97.                                     jcxz okk          ;检测为零则跳出
  98.                                         mov bx,ax        ;做过除法后低位放bx
  99.                                         mov ax,dx        ;做过除法后高位放ax
  100.                                 jmp short divzw                 ;循环除法直到商为零(即所有数字都转换为ascii)
  101.                                 okk:       
  102.                                      mov bx,es:2a2h
  103.                                      mov di,05h                    ;每一行的写入偏移量
  104.                                            mov cx,si                ;入栈次数作为循环条件放cx
  105.                                            putnu:
  106.                                              pop es:[bx+di]                ;依次将转换好的数据写入
  107.                                              inc di                                ;
  108.                                            loop putnu
  109.                                           
  110.                                           mov cx,8                        ;----不够8位字节以空格补足8位---
  111.                                           sub cx,si
  112.                                           adspp:
  113.                                               mov al,20h                        ;
  114.                                               mov es:[bx+di],al                ;在一个数末尾加一个空格
  115.                                                   inc di
  116.                                           loop adspp
  117.                                      add bx,20h                                ;写入下一行的行地址
  118.                                
  119.                                        
  120.                                   pop si                                        ;还原取数据地址          
  121.                                   add si,4                                        ;下一个取数地址
  122.                                     
  123.                                   
  124.                                   pop cx                                        ;还原外循环计数
  125.                                 loop recnum
  126.                                
  127.                                 mov es:2a0h,si                   ;保存当前取到数据的地址
  128.                 ret
  129.                
  130.                 PUTGZ:
  131.                                 mov si,es:02a0h                ;取原始数据地址
  132.                                 sub bx,bx                        ;行数计数,从零开始       
  133.                                 mov cx,15h                        ;21行要放入的数据循环21次
  134.                                
  135.                                 renum:
  136.                                 push cx                                 ;保存外循环计数
  137.                                 mov es:2A2h,bx                                ;保存行数计数
  138.                                
  139.                                 ;---准备除法传入参数
  140.                                 mov ax,[si]                              ;被除数
  141.                           
  142.                                 push si                                        ;保存取数据地址
  143.                                 sub si,si
  144.                                 ;sub bx,bx                        ;做计数器用,清零
  145.                                 divl:
  146.                                         mov dx,0                ;字除法,高位字置零
  147.                                     mov cx,10                ;除数放cx
  148.                                     div cx                        ;商在ax,余数在dx
  149.                                     add dx,30h                ;数字转换为ascii码
  150.                                 push dx                        ;转换好的数据入栈
  151.                                         inc si                         ;计数入栈次数
  152.                                     mov cx,ax        ;
  153.                                     ;add cx,dx        ;把商放入cx中
  154.                                     jcxz ok          ;检测为零则跳出
  155.                                         ;mov bx,ax        ;做过除法后低位放bx
  156.                                         ;mov ax,dx        ;做过除法后高位放ax
  157.                                 jmp short divl                 ;循环除法直到商为零(即所有数字都转换为ascii)
  158.                                 ok:       
  159.                                      mov bx,es:2a2h
  160.                                      mov di,0dh                    ;每一行的写入偏移量
  161.                                            mov cx,si                ;入栈次数作为循环条件放cx
  162.                                            putn:
  163.                                              pop es:[bx+di]                ;依次将转换好的数据写入
  164.                                              inc di                                ;
  165.                                            loop putn
  166.                                           
  167.                                           mov cx,8                        ;----不够5位字节以空格补足5位---
  168.                                           sub cx,si
  169.                                           adsp:
  170.                                               mov al,20h                        ;
  171.                                               mov es:[bx+di],al                ;在一个数末尾加一个空格
  172.                                                   inc di
  173.                                           loop adsp
  174.                                      add bx,20h                                ;写入下一行的行地址
  175.                                
  176.                                        
  177.                                   pop si                                        ;还原取数据地址          
  178.                                   add si,2                                        ;下一个取数地址
  179.                                     
  180.                                   
  181.                                   pop cx                                        ;还原外循环计数
  182.                                 loop renum
  183.                                
  184.                                 mov es:2a0h,si                   ;保存当前取到数据的地址
  185.                 ret
  186.                
  187.                         PUTMon:
  188.                                 mov si,es:02a0h                ;取原始数据地址
  189.                                 sub bx,bx                        ;行数计数,从零开始       
  190.                                 mov cx,15h                        ;21行要放入的数据循环21次
  191.                                
  192.                                 renumb:
  193.                                 push cx                                 ;保存外循环计数
  194.                                 mov es:2A2h,bx                                ;保存行数计数
  195.                                
  196.                                 ;---准备除法传入参数
  197.                                 mov ax,[si]                              ;被除数
  198.                           
  199.                                 push si                                        ;保存取数据地址
  200.                                 sub si,si
  201.                                 ;sub bx,bx                        ;做计数器用,清零
  202.                                 divll:
  203.                                         mov dx,0                ;字除法,高位字置零
  204.                                     mov cx,10                ;除数放cx
  205.                                     div cx                        ;商在ax,余数在dx
  206.                                     add dx,30h                ;数字转换为ascii码
  207.                                 push dx                        ;转换好的数据入栈
  208.                                         inc si                         ;计数入栈次数
  209.                                     mov cx,ax        ;
  210.                                     ;add cx,dx        ;把商放入cx中
  211.                                     jcxz okkk          ;检测为零则跳出
  212.                                         ;mov bx,ax        ;做过除法后低位放bx
  213.                                         ;mov ax,dx        ;做过除法后高位放ax
  214.                                 jmp short divll                 ;循环除法直到商为零(即所有数字都转换为ascii)
  215.                                 okkk:       
  216.                                      mov bx,es:2a2h
  217.                                      mov di,015h                    ;每一行的写入偏移量
  218.                                            mov cx,si                ;入栈次数作为循环条件放cx
  219.                                            putnn:
  220.                                              pop es:[bx+di]                ;依次将转换好的数据写入
  221.                                              inc di                                ;
  222.                                            loop putnn
  223.                                           
  224.                                           mov cx,4                        ;----不够4位字节以空格补足5位---
  225.                                           sub cx,si
  226.                                           adsppp:
  227.                                               mov al,20h                        ;
  228.                                               mov es:[bx+di],al                ;在一个数末尾加一个空格
  229.                                                   inc di
  230.                                                   loop adsppp
  231.                                                   mov al,0                                ;每行末尾加0
  232.                                                   mov es:[bx+di],al
  233.                                      add bx,20h                                ;写入下一行的行地址
  234.                                
  235.                                        
  236.                                   pop si                                        ;还原取数据地址          
  237.                                   add si,2                                        ;下一个取数地址
  238.                                     
  239.                                   
  240.                                   pop cx                                        ;还原外循环计数
  241.                                 loop renumb
  242.                                
  243.                                 mov es:2a0h,si                   ;保存当前取到数据的地址
  244.                 ret
  245.                
  246.                 divdw:        ;---双字除法---
  247.                                 ;参  数:除数放cx,高16位数放ax,低16位数放bx
  248.                                 ;返回值:高位商放dx,低位商放ax,余数放cx
  249.                         push bx                                ;不用作返回参数的寄存器保持原状
  250.                        
  251.                         sub dx,dx                        ;字除法dx会参与,将dx置零
  252.                         div cx                                ;div后,商在ax,余数在dx
  253.                         push ax                                ;保存高位除法的商
  254.                        
  255.                         mov ax,bx
  256.                         div cx                                ;做低位除法--相当于[mod(H/N)X10000h+L]/0Ah
  257.                         mov cx,dx                        ;余数放cx
  258.                         pop dx                                ;高位除法商放dx
  259.                        
  260.                         pop bx                                ;;不用作返回参数的寄存器恢复原状
  261.                 ret
  262.                
  263.                 show_str:
  264.                 call cls
  265.                 push ds
  266.                         mov ax,0b800h     ;
  267.                         mov ds,ax
  268.                         sub si,si
  269.                         sub di,di
  270.                        
  271.                        
  272.                         sub bx,bx
  273.                         sub dx,dx
  274.                         mov cx,15h
  275.                         showall:
  276.                                 push cx
  277.                                 showln:
  278.                                     
  279.                                 
  280.                                 mov al,es:[si]
  281.                                 mov ah,02
  282.                                 mov 28[bx+di],al
  283.                                 mov 29[bx+di],ah
  284.                                 inc si
  285.                                 inc di
  286.                                 inc di
  287.                                 mov ah,0
  288.                                 mov cx,ax
  289.                                 jcxz over
  290.                                 jmp showln
  291.                             over:
  292.                                 mov ax,0a0h
  293.                                 inc dx
  294.                                 push dx
  295.                                 push dx
  296.                                 mul dx
  297.                                 mov bx,ax
  298.                                 mov cx,20h
  299.                                 pop dx
  300.                                 mov ax,dx
  301.                                 mul cx
  302.                                 ;add ax,ax
  303.                                 mov si,ax
  304.                                
  305.                                 sub di,di
  306.                                 pop dx
  307.                            pop cx
  308.                         loop showall
  309.                 pop ds
  310.                 ret
  311.                 cls:
  312.                    push ax
  313.                    push cx
  314.                    push es
  315.                    push si
  316.                    mov cx,3840
  317.                    mov ax,0b800h
  318.                    mov es,ax
  319.                    sub si,si
  320.                    sc:mov ax,0
  321.                      mov es:[si],ax
  322.                      inc si
  323.                          loop sc
  324.                    pop si
  325.                    pop es
  326.                    pop cx
  327.                    pop ax
  328.                 ret
  329.        
  330.                
  331.                
  332. code ends
  333. 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-4-20 01:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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