| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
大佬们是这样的,实验10我的dtoc和show_ptr函数单独调用都是正确的,但是当我把他们放在一起后就会出错。比如我输入7894这个数字,我想把它转变为屏幕上的7894,我用dtoc函数可以在把他转变为 37,38,39,34存入内存中,但是在调用show——ptr函数就会显示 “26353366”不是我想要的 “7894”,但是如果我直接把 7894 直接写成 db ’ 7894 ‘,在调用show_ptr就可以成功在屏幕上显示成 “7894” ,我用debug调试发现都是正确的,能帮我看看是哪出了问题吗?  下面是我的代码: 
assume cs:codesg,ss:stack 
 
 
 
data segment 
db 10 dup (0) 
data ends 
 
stack segment 
db 100 dup (0) 
stack ends 
 
 
codesg segment 
start: 
      mov ax,7894 
          mov bx,data 
          mov ds,bx 
          mov si,0 
          call dtoc 
       
           
          mov dh,8 
          mov dl,3 
          mov cl,2 
          call show_str 
           
    
           
           
          mov ax,4c00h 
      int 21h 
           
           
           
          dtoc: 
                
               mov cx,0 
                
           
           
               mov si,1 
           
               dtoc_s: 
                     mov bx,10 
                         push si 
                     call divdw    
                         pop si 
                          
                          
                 add bx,30h                       ;余数加30得到ascii码 
                          
                     push bx 
                     mov cx,dx                        ;把商扔给cx判断是否为0 
                         
                          
                     jcxz dtoc_ruling 
                     inc si 
                          
                     jmp short dtoc_s 
                          
                         dtoc_ruling: 
                                     mov cx,ax 
                                                 jcxz dtoc_displace 
                                                 inc si 
                                                  
                                 jmp short dtoc_s 
                          
 
                          
                          
                          
               dtoc_displace: 
                    
                    
                    
                            mov cx,si 
                                mov si,0 
                                         
                                         
                                         
                                        dtoc_loop: 
                              pop ds:[si] 
                                          inc si 
                                loop dtoc_loop 
                         
                    
                    
 
                       
                           
                           
                                       
                       
                          mov ds:[si+1],byte ptr 0 
                           
                           
                           
                           
             ret 
                           
                           
                           
                           
                           
                           
                divdw: 
                               push ax 
                                   mov ax,dx 
                                   mov dx,0h 
                                   div bx 
                                   mov di,ax    ;存高位除法商 
                                   mov si,dx    ;存高位除法余数 
                                   pop ax 
                                   div bx 
                                   mov bx,dx 
                                   mov dx,di 
                                    
                                    
                                   ret           
                           
                           
                           
                           
                           
                           
                           
                           
                           
                           
                show_str: 
                   
                   mov ax,0b800h 
                   mov es,ax       ;显示区域内存 
                   mov ch,0 
                           mov ax,0 
                    
                   mov di,0 
                           mov al,160 
                            
                           mul dh          ;计算的是显示区域的m行 
                            
                            
                            
                            
                           mov si,ax 
                           mov ax,2 
                            
                           mul dl 
                           
                           add si,ax          ;以显示区域的第m行第n列开始 
                            
         
                            
                            
                            
                           mov ah,cl       ;显示属性 
                    
           
           
           
           
           
           
           
           
                 show_ptr_s:  
                                    mov cl,ds:[di]                
                                    jcxz show_ptr_ok                       ;判断有没有遇到0,遇到条转,反之向下走 
                                    mov al,cl 
                            
                                    mov es:[si],ax              ;吧内存中数据复制进显示区域内存 
                            
                                    add si,2 
                                    inc di 
                                    jmp short show_ptr_s 
                            
                            
                            show_ptr_ok: 
                                            ret 
                                   
         
                           
                           
                           
                            
                 
                
           
           
codesg ends 
 
end start 
 
                 |   
 
 
 
 |