haiouda 发表于 2014-9-3 20:21:54

这是什么错误?

173内容为: loop ka


haiouda 发表于 2014-9-3 20:27:49

assume cs:code,ss:stack,ds:data

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

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

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

dd 32 dup (0)

data ends


stack segment
dw 32 dup(0)
stack ends



code segment

start:   

            mov ax,data
                        mov ds,ax
                        mov ax,stack
                        mov ss,ax
                        mov sp,64
                       
                       
                        mov bx,0
                        mov si,84
                       
                       
                       
                       
                        mov dx,0      ;用dx作次数
                  mov cx,21    ;
               
kaa:   
              push cx
                       
                push bx
                        push si
                       
                     mov ax,
                        push ax
                        mov ax,
                        push dx
                       
                        pop dx
                        pop ax
                        call dtoc      ;60
                       
                        pop bx
                        pop si
                       
                       
                       
            mov dh,1               ;显示年份
                        mov dl,2
                        mov cx,2
                        push bx
                        push si
                        call sss   ;24
                        pop si
            pop bx                   ;显示年份

                       
                       
                          
                        push bx                     ;收入
                        push si
                       
               
                     mov ax,
                        push ax
                        mov ax,
                        push dx
                        pop dx
                        pop ax
                        call dtoc      ;60
                       
                        pop bx
                        pop si
                       
                       
                       
                        mov dh,1                ;显示收入
                        mov dl,7
                        mov cx,2
                                               
                        push bx
                        push si
                        call sss
                        pop si
                        pop bx                   ;显示收入
                       
                       
                       
                       
                        push bx                ;人数
                        push si
                       
                        mov ax,
                        push ax
                        mov ax,
                        push dx
                        pop dx
                        pop ax
                        call dtoc
                       
                        pop si
                        pop bx
                       
                       
                        mov dh,1                ;显示人数
                        mov dl,15
                        mov cx,2
                        push bx
                        push si
                        call sss
                        pop si
                        pop bx                  ;显示人数
                       
                       
                       
                       
                                          
                        mov ax,            ;准备收入(被除数)
                        push ax            ;高16位
                        mov ax,
                        push dx             ;40 ,低16位
                       
                                                                   
                     mov ax,          ;准备除数(人数)
                        push cx
                       
                        pop cx               ;准备除平均
                        pop dx
                        pop ax
                       
                       
                        call divdw       ;60   ;作除法
                       
                       
                        mov dh,1            ;显示平均数
                        mov dl,20
                        mov cx,2
               
                       
                        push bx
                        push si
                        call sss
                        pop si
                        pop bx               ;显示平均数



                       
         
                        add bx,4                         ;6e   
            pop cx
                        dec cx
                  
                       
                        loop kaa
                       
                       
                       
                       
                       
                       
                       
                       
                       
                       
                        mov ax,4c00h   ;4e
                        int 21h
                       
                       
                       
               
Saa:         ;子程序      ;将年份或人数或平均值之一入栈

   
                  
                
               

               
                       
                        ret             ;64
                                       
                       
                       
                       
                       
                       
               
               
dtoc :                        ;抽取数字,并转化为SACII码

               push dx
               push cx
                               push ax
                               push si
                               push bx
               


                  
                  mov bx,0      ;bx在子程序中用来存放位数,用栈来临时存放修改后的字符
                  
         s1:    mov cx,10
                                  ;mov dx,0       ;把用来存放余数的DX清零
                  
                                  call divdw      ;70
                                  mov di,cx               ;把余数给di临时保存
                                  mov cx,ax       ;商给CX,用来判断商是否为零
                                  
                       
                  jcxz s2       ;如果CX=0则跳到S1
                                  
                                  mov cx,di      ;恢复CX内值
               
                  
                  add cx,30h      ;余数加30H,得到相应的ASCII码
                                  push cx         ;保存到栈
                  inc bx          ;7f
                  
                                  
                                  
                  jmp short s1   
                                  
                                  
         s2:   
                        mov cx,di      ;82
                        add cx,30h       ;商为0时,余数为个位
                        push cx         ;87
                                  
                                  inc bx         ;再进行一次栈操作,(补充当“商为零而余数不为零”时的情况)
                        
                                  mov cx,bx      ;用CX出栈,把总进栈次数给CX
                                  mov di,cx      ;本程序中,用来保存长度
                                  mov si,256   
                                  mov ds:,cl
                                  
                   s3:          
                        pop ax            ;90
                        
                                  mov ds:,al
                                  inc si            ;93
                                  
                                  loop s3            ;94
                                  
                                  
                                  
                                  
        okay:               
                                           ;       ;s3实现将栈中的数据依次出栈,放到指定内存
                        
               
                  pop bx   ;96;bx压进去对,取出来就不对了??
                      pop si            ;
                             pop ax         ;
                                  pop cx
                                  pop dx


                              ret                    ;9b
             
                  

                  
sss:                  ;子程序 用来显示
            push bx

            mov cx,di         ;9d
                       
        ss1a:        push cx          ;9f ;这里显示位置有问题!!!!
                       
                       
                        mov si,256       ;a7
                       
                        callshow_str   ;在指定位置显示 ,aa
                        inc si             ;ad
                        inc dl
                       
                        pop cx
                        sub cx,1
                       
                       
                        loop ss1a
                       
                        pop bx
                       
                       
                  ret                  ;d5
               
                  
                  







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

               push si      ;b6
               push bx
         push ax      ;低16位先保存
               mov ax,dx    ;ax这时候的值是高16位了
               mov dx,0       ;dx置零是为了不影响下边余数位,使得高16位为0
               
               div cx          ;H/N(16位除法)
               mov bx,ax       ;ax,bx的值为int(商)H/N,dx的值为rem(余数)
                  
               
               pop ax          ;ax的值现在是L(低16位)
               div cx          ;L/N(16除法),ax被除数低16位,dx被除数高16位
               
               mov cx,dx
               mov dx,bx
               
               pop bx
               pop si
               ret             ;cb
               
               




               

       
       
       
show_str: ;在指定位置显示字符,dh=行号(0-24),dl=列号(0-79),cx=颜色
          ; ds:si指向字符串首地址
                  
         push cx      ;cc
         push si
               
         mov ax,0b800h;显存的开始地址
               mov es,ax      ;ES中存放是显存的第0页(共0-7页)的起始段地址
       
         mov al,160   ;每行80字符即160字节
         dec dh         ;第八行
               mul dh
               mov bx,ax
               
               mov al,2      ;一个字符占二字节
               dec dl      ;列从零开始,第三列,所以减一
               mul dl
                     
               add bx,ax      ;此时BX中放的是行与列的偏移地址
               mov di,0      ;di 指向显存的偏移地址
               mov al,cl       ;把颜色参数,放到al;e6
               
               mov si,256
               mov ch,0
               mov cl,
               
               mov si,257
               
        str:
             mov ah,ds:   ;ds:指向‘Wlcome to masm!',0,,,,e8
               
               
       
               mov es:,ah   ;偶字节放字符
               mov es:,al;奇字节放,颜色属性
               
               inc si
               loop str
               
               
               
               
        ok:       pop si
             pop cx
             
               ret         ;显示字符串的子程序【定义结束】;f3
       
                  
               
        code ends
end start
       
               

haiouda 发表于 2014-9-3 21:10:41

表示在,kaa:   到 loop kaa 之间有二个字节的错误,是这意思么??

haiouda 发表于 2014-9-3 21:34:25

在kaa:后面第一个push cx,和loop kaa 上最最近一个pop cx

去掉这一对,就一切正常

haiouda 发表于 2014-9-4 00:17:47

原来是loop 前移超出了

ghuibin 发表于 2014-9-4 21:20:52

{:5_107:}我是来打酱油的,随便帮楼主顶一下
页: [1]
查看完整版本: 这是什么错误?