鱼C论坛

 找回密码
 立即注册
查看: 5286|回复: 1

求助关于实验10的问题

[复制链接]
发表于 2021-5-10 20:42:21 | 显示全部楼层 |阅读模式

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

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

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

               
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-12 17:02:52 | 显示全部楼层
你这代码写的真乱  自己看能看懂吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 10:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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