|
主题 : : 实验10.3,debug调试后可以显示,但有问题 [待解决] |
回复[ 16次 ]
点击[ 620次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2011-12-06 08:52 ]
[引用]
[回复]
[ top ] | |
荣誉值: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 | | |
|
|
|
|
[第1楼]
[ 回复时间:2011-12-06 19:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
程序可能是正确的,之所以显示不对,可能是满屏了,滚屏了,然后向上滚了两行。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2011-12-06 19:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
|
|
|
|
|
[第3楼]
[ 回复时间:2011-12-06 19:26 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
|
|
|
|
|
[第4楼]
[ 回复时间:2011-12-07 08:20 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38 |
嗯,是这样的,屏幕不满屏时就用g命令运行到程序结尾就可以按要求显示了。谢谢指点。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2011-12-07 18:52 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2011-01-15 22:31 |
12666除法能益处 不能把 字单元能纯65535呢 | | |
|
|
|
|
[第6楼]
[ 回复时间:2011-12-09 13:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:13
注册日期:2011-07-13 08:38 |
;注:求余运算子程序有问题,因为循环结束的条件是商为零,而不是余数为零,该程序显示没
;有出问题是因为显示的数据中没有零,否则将会出错,正确答案请参照本人写的课程设计一的作业. | | |
|
|
|
|
[第7楼]
[ 回复时间:2012-01-31 02:49 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-01-10 21:29 |
|
|
|
|
|
[第8楼]
[ 回复时间:2012-01-31 02:56 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-01-10 21:29 |
我的求余运算子程序:
dtoc:
mov dx,0 ;高位补0进行32位除法运算!
mov bx,10
div bx ;求余
add dx,30h ;余转字符
mov cx,ax ;商判断0
mov di,0
inc di ;计数
push dx ;字符压栈
jcxz ok
jmp short toc
ok: mov cx,di
ok1: pop [si] ;出栈到data
inc si
loop ok1
ret | | |
|
|
|
|
[第9楼]
[ 回复时间:2012-01-31 03:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-01-10 21:29 |
mov di,0应该是外面的写错了
jmp short dtoc写成toc了 | | |
|
|
|
|
[第10楼]
[ 回复时间:2012-01-31 10:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
mov di,0改一下应该就没问题了。还是要在计算机上验证一下。 | | |
|
|
|
|
[第11楼]
[ 回复时间:2012-03-13 17:10 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2012-02-16 19:46 |
先将字符压栈,若果要处理的字符串很多,几千几万个,怎么办??那栈还能放得下吗??? | | |
|
|
|
|
[第12楼]
[ 回复时间:2012-03-13 23:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
|
|
|
|
|
[第13楼]
[ 回复时间:2012-06-29 20:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-03-09 19:30 |
回复:[第12楼]
------------------
压栈和出栈都是字操作,可是存放到数据段中的应该是字节啊? | | |
|
|
|
|
[第14楼]
[ 回复时间:2012-06-29 20:47 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-03-09 19:30 |
显示字符串子程序是显示的字节,楼主这里通过出栈,存储在data段中的是字,这个怎么回事? | | |
|
|
|
|
[第15楼]
[ 回复时间:2012-07-27 12:55 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:1
注册日期:2012-04-23 22:44 |
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start: mov ax,1226
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 cx
push bx
push di
push dx
push si
push ax ;要用到的寄存器进栈
mov cx,5
mov bx,10
mov ax,12666
mov si,4
s: mov dx,0
div bx
add dl,30h
mov ds:[si],dl
dec si
loop s ;以上操作避免溢出转换为32位进行除法运算,并把结果转换为ASC码,为输出显示做准备
pop ax
pop si
pop dx
pop di
pop bx
pop cx ;用到的寄存器出栈,注意顺序
ret
show_str: push ax
push cx
push dx
push bx
push si
mov al,0a0h
mul dh
mov dh,0
add dl,dl
add ax,dx
mov bx,ax
mov ax,0b800h
mov es,ax ;计算并设定行与列的起始位置
wt: push cx
mov cl,ds:[si]
mov es:[bx],cl
mov ch,0
jcxz ok
pop cx
mov es:[bx].1,cl
inc si
add bx,2
jmp wt ;输出显示
ok: pop cx
pop si
pop bx
pop dx
pop cx
pop ax ;出栈
ret
code ends
end start
这是我写出来的,希望大家指点下 | | |
|
|
|
|
[第16楼]
[ 回复时间:2012-07-27 13:01 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:1
注册日期:2012-04-23 22:44 |
转换为字符串显示,除以10,所以余数不可能超过10,我就直接用DL,30H了 | | |