鱼C论坛

 找回密码
 立即注册
查看: 650|回复: 2

[已解决]显示数值

[复制链接]
发表于 2023-8-13 15:09:08 | 显示全部楼层 |阅读模式

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

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

x
;名称:dtoc
;功能:将word型数据转变为表示十进制数的字符串, 字符串以0为结尾符
;参数:(a x) =word型数据
;ds:si指向字符串的首地址
;返回值:无

;应用举例:编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。
;在显示时我们调用本次实验中的第一个子程序show_str。


assume cs:code

data segment
        db 10 dup(0)

data ends

  
code segment 
      start:
                mov ax,12666
                        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:push bx
               push dx
                   push cx
                   
                   ;计算字符总数
                   mov bx,1  ;bx保存字符总数
                   mov dl,10
                   push ax  ;保存被除数
            s2:div dl
                   mov ch,0
                   mov cl,al ;把商传给cx
                   jcxz ss1
                   inc bx   ;字符数加1
                   mov ah,0  ;清除余数,ax就是商
                   
                   mov cx,2  ;保证loop时,cx不等于0
                   loop s2
                                
                ss1:pop ax  ;读取被除数
                
                ;写入字符
                ;bx=字符总数,bx-1就是偏移量
                
                   mov bx,0   ;写结束字符0
                   
                s3:div dl
                   add ah,30h   ;把余数转换成ASCII吗
                   mov [bx-1],ah  ;写入字符,注意倒序
           mov ah,0  ;清除余数,ax就是商
           mov ch,0
                   mov cl,al ;把商传给cx
           jcxz s4  ;如果商=0就结束   
                   dec bx
                   mov cx,2  ;保证loop时,cx不等于0
                   loop s3                
                                                           
                s4:        mov si,0  ;字符串首地址                
                    pop cx
                        pop dx
                        pop bx
                        ret
                        
                        
                        
                        
  show_str:  ;子程序用到的寄存器一定要先保存
           push ax
           push es
                   push bx
                   push bp
                   
                   
           
                   mov ax,0B800h   ;显存段地址
                   mov es,ax
                   mov bl,cl       ;bl保存颜色
                                      
                   ;计算偏移量
                   mov al,160
                   mul dh
                   mov bp,ax
                   mov al,2
                   mul dl
                   add bp,ax  ;计算出偏移量;bp显存偏移量
                                                  
                 s:mov ch,0
                   mov cl,[si]  ; 提取字符
                   jcxz s1     ;0字符返回
                   mov es:[bp],cl
                   mov es:[bp+1],bl
                   inc si
                   add bp,2
                   jmp s
                              
  
  
                s1:pop bp
                   pop bx
                   pop es
                   pop ax
           ret      ;返回
          
 code ends 
 end start
 
 
 




我的问题:运行时  处于死机状态  ??

最佳答案
2023-8-13 15:09:38
问题可能出在以下几个地方:

1. 程序中的循环可能陷入无限循环,导致死机。你可以在循环中添加一些条件判断,确保循环能够正常结束。

2. 程序中的栈操作可能有问题。你可以检查栈的使用情况,确保栈的操作正确。

3. 程序中的寄存器使用可能有问题。你可以检查程序中寄存器的使用情况,确保寄存器的值正确。

4. 程序中的内存访问可能有问题。你可以检查程序中对内存的访问情况,确保内存的读写操作正确。

你可以逐步调试程序,查找问题所在。可以使用调试工具来单步执行程序,观察程序的执行情况,找到问题所在。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-13 15:09:38 | 显示全部楼层    本楼为最佳答案   
问题可能出在以下几个地方:

1. 程序中的循环可能陷入无限循环,导致死机。你可以在循环中添加一些条件判断,确保循环能够正常结束。

2. 程序中的栈操作可能有问题。你可以检查栈的使用情况,确保栈的操作正确。

3. 程序中的寄存器使用可能有问题。你可以检查程序中寄存器的使用情况,确保寄存器的值正确。

4. 程序中的内存访问可能有问题。你可以检查程序中对内存的访问情况,确保内存的读写操作正确。

你可以逐步调试程序,查找问题所在。可以使用调试工具来单步执行程序,观察程序的执行情况,找到问题所在。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 15:09:58 | 显示全部楼层
根据提供的代码,我看到以下问题可能导致死机状态:

1. 在子程序 dtoc 中,你没有设置循环的退出条件。在 s4 标签处,你使用了 jcxz s4 指令来判断循环是否结束,但是之前并没有设置 cx 寄存器的值,导致无法正确判断循环是否应该退出。你可以在 dtoc 子程序的开始处添加一行 mov cx, bx 来初始化 cx 寄存器,将字符总数赋给它。

2. 运行子程序 show_str 时,你传递的颜色参数 cl 可能不正确。请确保 cl 寄存器中存储的是正确的颜色值。例如,如果想要使用绿色显示(绿色的颜色代码为2),可以在主程序开始处添加一行 mov cl, 2 来设置颜色值。

3. 另外,你在代码中调用了中断指令 int 21h,但没有在数据段或代码段中定义相应的中断处理程序。这可能会导致程序无法正常退出。

请尝试更正上述问题,并重新运行程序。如果问题仍然存在,请提供更多相关的信息或完整的代码,以便我能够更好地帮助你解决问题。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 02:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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