巨牙海民654 发表于 2021-5-10 20:42:21

求助关于实验10的问题

大佬们是这样的,实验10我的dtoc和show_ptr函数单独调用都是正确的,但是当我把他们放在一起后就会出错。比如我输入7894这个数字,我想把它转变为屏幕上的7894,我用dtoc函数可以在把他转变为 37,38,39,34存入内存中,但是在调用show——ptr函数就会显示 “26353366”不是我想要的 “7894”,但是如果我直接把 7894 直接写成 db ’ 7894 ‘,在调用show_ptr就可以成功在屏幕上显示成 “7894” ,我用debug调试发现都是正确的,能帮我看看是哪出了问题吗?{:10_254:} 下面是我的代码:
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:
                                          inc si
                                loop dtoc_loop
                       
                  
                  

                     
                          
                          
                                      
                     
                          mov ds:,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:               
                                    jcxz show_ptr_ok                     ;判断有没有遇到0,遇到条转,反之向下走
                                    mov al,cl
                          
                                    mov es:,ax            ;吧内存中数据复制进显示区域内存
                          
                                    add si,2
                                    inc di
                                    jmp short show_ptr_s
                          
                          
                            show_ptr_ok:
                                          ret
                                  
       
                          
                          
                          
                          
               
             
          
          
codesg ends

end start

               

wyfx0912zj 发表于 2021-5-12 17:02:52

你这代码写的真乱自己看能看懂吗
页: [1]
查看完整版本: 求助关于实验10的问题