显示数值
;名称: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 ,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,; 提取字符
jcxz s1 ;0字符返回
mov es:,cl
mov es:,bl
inc si
add bp,2
jmp s
s1:pop bp
pop bx
pop es
pop ax
ret ;返回
code ends
end start
我的问题:运行时处于死机状态??
问题可能出在以下几个地方:
1. 程序中的循环可能陷入无限循环,导致死机。你可以在循环中添加一些条件判断,确保循环能够正常结束。
2. 程序中的栈操作可能有问题。你可以检查栈的使用情况,确保栈的操作正确。
3. 程序中的寄存器使用可能有问题。你可以检查程序中寄存器的使用情况,确保寄存器的值正确。
4. 程序中的内存访问可能有问题。你可以检查程序中对内存的访问情况,确保内存的读写操作正确。
你可以逐步调试程序,查找问题所在。可以使用调试工具来单步执行程序,观察程序的执行情况,找到问题所在。 根据提供的代码,我看到以下问题可能导致死机状态:
1. 在子程序 dtoc 中,你没有设置循环的退出条件。在 s4 标签处,你使用了 jcxz s4 指令来判断循环是否结束,但是之前并没有设置 cx 寄存器的值,导致无法正确判断循环是否应该退出。你可以在 dtoc 子程序的开始处添加一行 mov cx, bx 来初始化 cx 寄存器,将字符总数赋给它。
2. 运行子程序 show_str 时,你传递的颜色参数 cl 可能不正确。请确保 cl 寄存器中存储的是正确的颜色值。例如,如果想要使用绿色显示(绿色的颜色代码为2),可以在主程序开始处添加一行 mov cl, 2 来设置颜色值。
3. 另外,你在代码中调用了中断指令 int 21h,但没有在数据段或代码段中定义相应的中断处理程序。这可能会导致程序无法正常退出。
请尝试更正上述问题,并重新运行程序。如果问题仍然存在,请提供更多相关的信息或完整的代码,以便我能够更好地帮助你解决问题。
如果问题已经解决,请设置最佳答案
页:
[1]