|
主题 : : 实验10.3,debug调试后可以显示,但有问题 [待解决] |
回复[ 16次 ]
点击[ 636次 ] | |
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38 |
下面是实验10.3的作业,但在debug中调试时虽然可以显示,但显示位置不是定义的8行3列,而是6行3列,这是什么原因呢,大家帮我看看:
;名称:dtoc
;功能:将word型数据转变为表示十进制数的字符串,字符串以0为结尾符.
;参数:(ax)=word型数据
; ds:si指向字符串的首地址
;返回:无
;应用举例:编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来.在显示时调
;用实验10.1的子程序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
mov di,0 ;这1句是增加的代码,书本中没有
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
;****************
;显示字符串子程序
;****************
show_str:
mov si,0
mov ax,0B800h
mov es,ax
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
mov di,ax ;以上代码定位字符串的内存位置
mov ch,0
s:
push cx ;颜色信息入栈
mov al,[si]
mov es:[bx+di],al
mov es:[bx+di+1],cl
mov cl,[si]
jcxz ok ;如果未到达字符尾(cx不等于0),将字符写入指定内存,否则返回主程序结束
inc si
add di,2
pop cx ;恢复颜色信息
jmp short s
ok:
add sp,2
ret
;*************************************************
;求余运算并将余数转化为相应的ASCII码存放到data段中
;*************************************************
dtoc:
push ax ;将被除数的低16位入栈
mov ax,dx
mov dx,0
mov cx,10
div cx ;该指令执行后ax中存放的是int(H/N),dx中存放的是rem(H/N)
mov bx,ax ;因为后面要用到int(H/N),所以将它存放到bx中
pop ax ;该指令执行后dx,ax中存放的是T=[rem(H/N)*65536+L]的高16位和低16位
div cx ;该指令执行后dx中存放的是T/N的余数,ax中存放的是T/N的商(这个商正是结
;果的低位)
mov cx,dx ;余数按要求应放到cx中
mov dx,bx ;高位存放int(H/N)
jcxz s0
add cx,30h ;将余数转化为字符
push cx ;将字符逆序压栈
inc di ;di存放字符的数量
jmp short dtoc
s0:
mov cx,di
s1:
pop [si] ;将字符出栈到data段中
inc si
loop s1
ret
code ends
end start | | |