鱼C论坛

 找回密码
 立即注册
查看: 1587|回复: 5

这是什么错误?

[复制链接]
发表于 2014-9-3 20:21:54 | 显示全部楼层 |阅读模式

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

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

x
173内容为: loop ka


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

使用道具 举报

 楼主| 发表于 2014-9-3 20:27:49 | 显示全部楼层
  1. assume cs:code,ss:stack,ds:data

  2. data segment
  3. dd 1975,1976,1977,1978,1979,1980,1981,1982,1983
  4. dd 1984,1985,1986,1987,1988,1989,1990,1991,1992
  5. dd 1993,1994,1995

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

  8. dd 3,7,9,13,28,38,130,220,476,778,1101,1442,2258,2793,4037,5635,8226
  9. dd 11542,14430,15257,17800

  10. dd 32 dup (0)

  11. data ends


  12. stack segment
  13. dw 32 dup(0)
  14. stack ends



  15. code segment

  16. start:   

  17.             mov ax,data
  18.                         mov ds,ax
  19.                         mov ax,stack
  20.                         mov ss,ax
  21.                         mov sp,64
  22.                        
  23.                        
  24.                         mov bx,0
  25.                         mov si,84
  26.                        
  27.                        
  28.                        
  29.                        
  30.                         mov dx,0      ;用dx作次数
  31.                     mov cx,21    ;
  32.                
  33. kaa:   
  34.                 push cx
  35.                        
  36.                 push bx
  37.                         push si
  38.                        
  39.                        mov ax,[bx]
  40.                         push ax
  41.                         mov ax,[bx+2]
  42.                         push dx
  43.                        
  44.                         pop dx
  45.                         pop ax
  46.                         call dtoc        ;60
  47.                        
  48.                         pop bx
  49.                         pop si
  50.                        
  51.                        
  52.                        
  53.             mov dh,1               ;显示年份
  54.                         mov dl,2
  55.                         mov cx,2
  56.                         push bx
  57.                         push si
  58.                         call sss     ;24
  59.                         pop si
  60.             pop bx                   ;显示年份

  61.                        
  62.                        
  63.                           
  64.                         push bx                     ;收入
  65.                         push si
  66.                        
  67.                
  68.                        mov ax,[bx+si]
  69.                         push ax
  70.                         mov ax,[bx+si+2]
  71.                         push dx
  72.                         pop dx
  73.                         pop ax
  74.                         call dtoc        ;60
  75.                        
  76.                         pop bx
  77.                         pop si
  78.                        
  79.                        
  80.                        
  81.                         mov dh,1                ;显示收入
  82.                         mov dl,7
  83.                         mov cx,2
  84.                                                
  85.                         push bx
  86.                         push si
  87.                         call sss
  88.                         pop si
  89.                         pop bx                   ;显示收入
  90.                        
  91.                        
  92.                        
  93.                        
  94.                         push bx                ;人数
  95.                         push si
  96.                        
  97.                         mov ax,[bx+si+84]
  98.                         push ax
  99.                         mov ax,[bx+si+86]
  100.                         push dx
  101.                         pop dx
  102.                         pop ax
  103.                         call dtoc
  104.                        
  105.                         pop si
  106.                         pop bx
  107.                        
  108.                        
  109.                         mov dh,1                ;显示人数
  110.                         mov dl,15
  111.                         mov cx,2
  112.                         push bx
  113.                         push si
  114.                         call sss
  115.                         pop si
  116.                         pop bx                  ;显示人数
  117.                        
  118.                        
  119.                        
  120.                        
  121.                                             
  122.                         mov ax,[bx+si]            ;准备收入(被除数)
  123.                         push ax              ;高16位
  124.                         mov ax,[bx+si+2]
  125.                         push dx             ;40 ,低16位
  126.                        
  127.                                                                      
  128.                        mov ax,[bx+si+84]          ;准备除数(人数)
  129.                         push cx
  130.                        
  131.                         pop cx               ;准备除平均
  132.                         pop dx
  133.                         pop ax
  134.                        
  135.                        
  136.                         call divdw       ;60   ;作除法
  137.                        
  138.                        
  139.                         mov dh,1              ;显示平均数
  140.                         mov dl,20
  141.                         mov cx,2
  142.                
  143.                        
  144.                         push bx
  145.                         push si
  146.                         call sss
  147.                         pop si
  148.                         pop bx                 ;显示平均数



  149.                        
  150.            
  151.                         add bx,4                         ;6e   
  152.             pop cx
  153.                         dec cx
  154.                     
  155.                        
  156.                         loop kaa
  157.                        
  158.                        
  159.                        
  160.                        
  161.                        
  162.                        
  163.                        
  164.                          
  165.                          
  166.                          
  167.                         mov ax,4c00h     ;4e
  168.                         int 21h
  169.                        
  170.                        
  171.                        
  172.                
  173. Saa:         ;子程序        ;将年份或人数或平均值之一入栈

  174.    
  175.                   
  176.                 
  177.                

  178.                
  179.                        
  180.                         ret             ;64
  181.                                        
  182.                        
  183.                        
  184.                        
  185.                          
  186.                          
  187.                
  188.                  
  189. dtoc :                        ;抽取数字,并转化为SACII码

  190.                  push dx
  191.                  push cx
  192.                                  push ax
  193.                                  push si
  194.                                  push bx
  195.                


  196.                   
  197.                   mov bx,0        ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
  198.                   
  199.            s1:    mov cx,10
  200.                                   ;mov dx,0       ;把用来存放余数的DX清零
  201.                   
  202.                                   call divdw      ;70
  203.                                   mov di,cx                 ;把余数给di临时保存
  204.                                   mov cx,ax       ;商给CX,用来判断商是否为零
  205.                                   
  206.                          
  207.                   jcxz s2       ;如果CX=0则跳到S1
  208.                                   
  209.                                   mov cx,di      ;恢复CX内值
  210.                  
  211.                   
  212.                   add cx,30h      ;余数加30H,得到相应的ASCII码
  213.                                   push cx         ;保存到栈
  214.                   inc bx          ;7f
  215.                   
  216.                                   
  217.                                   
  218.                   jmp short s1     
  219.                                   
  220.                                   
  221.            s2:   
  222.                           mov cx,di        ;82
  223.                           add cx,30h       ;商为0时,余数为个位
  224.                           push cx           ;87
  225.                                   
  226.                                   inc bx           ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
  227.                           
  228.                                   mov cx,bx        ;用CX出栈,把总进栈次数给CX
  229.                                   mov di,cx        ;本程序中,用来保存长度
  230.                                   mov si,256   
  231.                                   mov ds:[si],cl
  232.                                   
  233.                    s3:          
  234.                           pop ax            ;90
  235.                           
  236.                                   mov ds:[si+1],al
  237.                                   inc si            ;93
  238.                                   
  239.                                   loop s3            ;94
  240.                                   
  241.                                   
  242.                                   
  243.                                   
  244.         okay:                 
  245.                                            ;       ;s3实现将栈中的数据依次出栈,放到指定内存
  246.                           
  247.                
  248.                   pop bx     ;96  ;bx压进去对,取出来就不对了??
  249.                       pop si            ;
  250.                                pop ax           ;
  251.                                   pop cx
  252.                                   pop dx


  253.                               ret                    ;  9b
  254.              
  255.                   

  256.                   
  257. sss:                  ;子程序 用来显示
  258.             push bx

  259.             mov cx,di         ;9d
  260.                        
  261.         ss1a:        push cx          ;9f ;这里显示位置有问题!!!!
  262.                        
  263.                        
  264.                         mov si,256       ;a7
  265.                        
  266.                         call  show_str     ;在指定位置显示 ,aa
  267.                         inc si             ;ad
  268.                         inc dl
  269.                        
  270.                         pop cx
  271.                         sub cx,1
  272.                        
  273.                        
  274.                         loop ss1a
  275.                        
  276.                         pop bx
  277.                        
  278.                        
  279.                     ret                    ;d5
  280.                
  281.                   
  282.                   







  283. divdw:  ;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数  ,b6
  284.         ;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数

  285.                  push si        ;b6
  286.                  push bx
  287.          push ax        ;低16位先保存
  288.                  mov ax,dx    ;ax这时候的值是高16位了
  289.                  mov dx,0       ;dx置零是为了不影响下边余数位,使得高16位为0
  290.                  
  291.                  div cx          ;H/N(16位除法)
  292.                  mov bx,ax       ;ax,bx的值为int(商)H/N,dx的值为rem(余数)
  293.                   
  294.                  
  295.                  pop ax          ;ax的值现在是L(低16位)
  296.                  div cx          ;L/N(16除法),ax被除数低16位,dx被除数高16位
  297.                  
  298.                  mov cx,dx
  299.                  mov dx,bx
  300.                  
  301.                  pop bx
  302.                  pop si
  303.                  ret             ;cb
  304.                  
  305.                  




  306.                  

  307.          
  308.          
  309.          
  310. show_str: ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色
  311.           ; ds:si指向字符串首地址
  312.                   
  313.          push cx      ;cc
  314.          push si
  315.                  
  316.          mov ax,0b800h  ;显存的开始地址
  317.                  mov es,ax      ;ES中存放是显存的第0页(共0-7页)的起始段地址
  318.        
  319.          mov al,160     ;每行80字符即160字节
  320.          dec dh         ;第八行
  321.                  mul dh
  322.                  mov bx,ax
  323.                  
  324.                  mov al,2      ;一个字符占二字节
  325.                  dec dl        ;列从零开始,第三列,所以减一
  326.                  mul dl
  327.                      
  328.                  add bx,ax      ;此时BX中放的是行与列的偏移地址
  329.                  mov di,0        ;di 指向显存的偏移地址
  330.                  mov al,cl       ;把颜色参数,放到al;e6
  331.                  
  332.                  mov si,256
  333.                  mov ch,0
  334.                  mov cl,[si]
  335.                  
  336.                  mov si,257
  337.                  
  338.         str:
  339.              mov ah,ds:[si]   ;ds:[si]指向‘Wlcome to masm!',0,,,,e8
  340.                
  341.                  
  342.        
  343.                  mov es:[bx+di],ah   ;偶字节放字符
  344.                  mov es:[bx+di+1],al  ;奇字节放,颜色属性
  345.                  
  346.                  inc si
  347.                  loop str
  348.                  
  349.                  
  350.                  
  351.                  
  352.         ok:         pop si
  353.              pop cx
  354.              
  355.                  ret         ;显示字符串的子程序【定义结束】  ;f3
  356.          
  357.                   
  358.                  
  359.         code ends
  360. end start
  361.        
  362.                  
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-3 21:10:41 | 显示全部楼层
表示在,kaa:   到 loop kaa 之间有二个字节的错误,是这意思么??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-3 21:34:25 | 显示全部楼层
在kaa:后面第一个push cx,和loop kaa 上最最近一个pop cx

去掉这一对,就一切正常
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-4 00:17:47 | 显示全部楼层
原来是loop 前移超出了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-4 21:20:52 | 显示全部楼层
我是来打酱油的,随便帮楼主顶一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-30 13:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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