鱼C论坛

 找回密码
 立即注册
查看: 2023|回复: 0

[汇编作业] 课程设计 1 我回来了

[复制链接]
发表于 2015-5-3 18:36:17 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 haiouda 于 2015-5-4 09:36 编辑
  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'   ;0-83

  6. dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,19514
  7. dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000 ;84-167

  8. dw 3,7,9,13,28,38,130,220,476,778,1001,1142,2258,2793,4037,5635,8226
  9. dw 11542,14430,15257,17800  ;168-210

  10. db 14 dup(0)   ;211-223

  11. dd 120 dup(0)   ;224-480(224,14行开头)

  12. data ends


  13. stack segment
  14. dw 16 dup(0)
  15. stack ends


  16. code segment

  17. start:  MOV AX,stack
  18.         MOV SS,AX
  19.         MOV SP,32
  20.       
  21.         MOV AX,data
  22.         MOV DS,AX
  23.                
  24.                
  25.                 mov word ptr ds:[220],168
  26.                 mov bx,84
  27.                 mov si,0
  28.                 mov di,168                ;指向人数
  29.         mov bp,288               
  30.                 mov cx,21
  31.                
  32.                
  33.         z1:        push cx
  34.             call movn   ;年份移到指定位置
  35.         
  36.         
  37.                
  38.                 call shoru  ;总收入改成SACII码移到指定位置
  39.                
  40.                
  41.                 call men    ;人数改成SACII码移到指定位置
  42.                
  43.                 call pjsr   ;平均收入改成SACII码移到指定位置
  44.                
  45.                 pop cx
  46.         loop z1
  47.                
  48.                 call  show_str  ;显示
  49.                
  50.                
  51.   
  52.         
  53.         MOV AX,4C00H
  54.         INT 21H
  55.                
  56. movn:   
  57.          
  58.              mov cx,4
  59.             
  60.          w2: mov al,[si]
  61.                  inc si
  62.                  mov ds:[bp],al
  63.                  inc bp
  64.                  
  65.                  loop w2
  66.                  
  67.                  mov byte ptr ds:[bp],0
  68.                  inc bp
  69.                
  70.             
  71.       
  72.         ret               
  73.                

  74. shoru:   
  75.         
  76.                
  77.                                           
  78.                  mov ax,[bx]  ;读数据(收入)                                 
  79.                          add bx,2
  80.                          mov dx,[bx]                                
  81.                          add bx,2     ;si 指向下一个数据
  82.                                  
  83.                                  push ax
  84.                                  push dx
  85.                                                                  
  86.                                  mov cx,[di]
  87.                                  add di,2

  88.                  call divdw    ;这次为求平均数
  89.                              mov ds:[211],ax    ;平均收入低16位
  90.                                  mov ds:[213],dx    ;平均收入高16位
  91.                                                                                  
  92.                                  pop dx
  93.                                  pop ax
  94.                             call sjbw   ; 分解各位
  95.                         
  96.                                  
  97.                  
  98.                  
  99.                                  
  100.                  ret        

  101. sjbw:   

  102.          mov word ptr ds:[215],0     ;暂存被除数低16位
  103.                  mov word ptr ds:[217],0     ;用来记录cx(数据的长度)
  104.                

  105.                  
  106.                         s0:         mov cx,10
  107.                              call divdw   ;这次目的是分解 年的总收入
  108.                         
  109.                          mov ds:[215],ax    ;保护被除数低16位
  110.                                                    
  111.                          push cx   ; 余数入栈(从低位到高位顺序入栈)
  112.                              mov ax,ds:[217]   ;这个内存单元用来记录入栈次数即数值长度
  113.                          inc ax  
  114.                              mov ds:[217],ax
  115.                           
  116.                              mov ax,ds:[215]
  117.                            
  118.                                  push dx
  119.                                  or cx,dx
  120.                              or cx,ax   ;商(高低16位全部为零)并且余数同时为零,即此数据被分解完毕
  121.                                  pop dx
  122.                                  inc cx    ;当cx为零时,用于退出循环
  123.                          loop s0   ;余数为零,代表这个数已经按从低到高入栈完毕
  124.                  
  125.                          mov cx,ds:[217] ;数值长度给cx用于循环次数
  126.                            
  127.                  
  128.                  
  129.                      pop ax      ;数据个个位倒序出栈
  130.                                  
  131.                         
  132.                              dec cx      ;每串数都以零开头,所以第一个数(0)不加30h,同时cx减少一次循环
  133.                
  134.                  s1: pop ax
  135.                          add al,30h  ;每位改成ASICII码
  136.                          mov ds:[bp],al                 
  137.                          inc bp
  138.                          loop s1  
  139.                                  
  140.          mov byte ptr ds:[bp],0 ; 因为每组数字都以零开头,补个零结尾,这样要显示的数字实际开始位置为,ds:[32]
  141.                  inc bp
  142.                  
  143.                  
  144.                
  145.          ret                                 
  146.                  
  147.                  
  148.                
  149.                
  150. divdw:  
  151.           push bx
  152.                   push ax
  153.            
  154.                   mov ax,dx
  155.                   mov dx,0
  156.                   div cx        ;高16位作除法
  157.                   
  158.                   mov bx,ax    ;ax高16位的商,dx余数
  159.                   
  160.                   pop ax        
  161.                   div cx          ;低16位作除法

  162.                   mov cx,dx
  163.                   mov dx,bx
  164.                   
  165.          pop bx
  166.              ret
  167.                

  168.                

  169.                
  170. men :   push di
  171.         
  172.          mov di,ds:[220]
  173.          mov ax,[di]
  174.                  add di,2
  175.                  mov dx,0
  176.                  
  177.                  call sjbw
  178.                  
  179.                  mov ds:[220],di
  180.          pop di     
  181.      ret   

  182.          
  183. pjsr:    mov ax,ds:[211]
  184.          mov dx,ds:[213]
  185.                  
  186.                  call sjbw
  187.                  
  188.         ret         
  189.                  

  190. show_str: mov ax,0b800h   ;显示字符串
  191.           mov es,ax              
  192.           mov ax,0
  193.                   
  194.                   mov al,3    ;显示位置,第九行                  
  195.                   mov cl,10    ; 第三例
  196.                   
  197.                   mov bx,0
  198.                   mov bl,160
  199.                   mul bl
  200.                   mov bx,0
  201.                   add bx,ax
  202.                   mov ax,0
  203.                   mov al,2   
  204.                   
  205.                   mul cl
  206.                   add bx,ax     ;bx为首字偏移值
  207.                   
  208.                   
  209.                    mov ch,2      ; 颜色为绿色
  210.                   
  211.                   mov al,ch     ;颜色放al中保存
  212.                   
  213.                   mov di,0                  
  214.                   mov si,288
  215.                  
  216.                   mov cx,21
  217.         x2:   push cx
  218.               call show_str11                        
  219.                   add bx,160
  220.           mov di,0        

  221.                   pop cx
  222.                   loop x2
  223.                   
  224.                   ret
  225.                  
  226.                   
  227.                   
  228.                   
  229. show_str11:  mov cx,4

  230.         x5:  push di
  231.                 x3:         push cx
  232.                      

  233.                   mov cl,[si]
  234.                  mov ch,0
  235.                  jcxz x4      ;cx为零时 跳到s1
  236.               
  237.         
  238.                                    
  239.                       mov es:[bx+di],cl
  240.                       mov es:[bx+di+1],al
  241.                   
  242.                       inc si
  243.                       add di,2
  244.                   
  245.                       pop cx
  246.                       jmp short x3
  247.                   
  248.                      
  249.                   
  250.            x4:           pop cx
  251.                   pop di
  252.                   
  253.                           inc si
  254.                           add di,28  ;显示二个数字之间加个空格,di必须为2的倍数
  255.               loop x5        
  256.                               
  257.                  
  258.                      
  259.                  
  260.                  
  261. ret                 
  262.                  
  263.                  
  264.                  
  265.                  
  266.                  
  267. code ends
  268. end start                 
  269.                  
  270.                  



  271.                  
  272.                  

  273.          


复制代码

用了一个白天的时间,大多数时间,在纠结几个基本的错误,比如2个小时,纠结 data 段设得小了,自己全然不知,导致错误,等

现在这个可以显示出来了就是有一部分被 debug 给刷新了,有谁能给个办法,看到全陪呀?


33333333.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-14 05:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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