马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
我的问题:运行时 处于死机状态 ??
问题可能出在以下几个地方:
1. 程序中的循环可能陷入无限循环,导致死机。你可以在循环中添加一些条件判断,确保循环能够正常结束。
2. 程序中的栈操作可能有问题。你可以检查栈的使用情况,确保栈的操作正确。
3. 程序中的寄存器使用可能有问题。你可以检查程序中寄存器的使用情况,确保寄存器的值正确。
4. 程序中的内存访问可能有问题。你可以检查程序中对内存的访问情况,确保内存的读写操作正确。
你可以逐步调试程序,查找问题所在。可以使用调试工具来单步执行程序,观察程序的执行情况,找到问题所在。
|