|
主题 : : 实验10.3, 12666 写屏时无法进行写入(单步调试),显示不相符,求原因 [已解决] |
回复[ 8次 ]
点击[ 369次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2012-05-06 20:04 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-09-25 11:28 |
assume cs:code,ds:data,ss:stack
data segment
dw 8 dup (0)
data ends
stack segment
dw 8 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
MOV AX,12666
mov si,0
call near ptr divdw
mov dh,3 ;定义第三行
mov dl,4 ;定义第三列
mov cl,00000010b ;显示效果为黑底绿字
CALL near ptr STRY
mov ax,4c00h
int 21h
divdw:
PUSH AX
mov ax,dx ;将被除数高16位存入AX,先进行高16位的运算
mov dx,0 ;被除数高16置0
mov cx,10 ;设置除数为10
DIV CX
MOV BX,AX ;高16位的商暂存BX
POP AX
DIV CX
PUSH DX ;最终算出的余数,压入栈中
MOV DX,BX
INC SI
MOV CX,AX
JCXZ OK
JMP DIVDW
OK: MOV CX,SI
MOV BX,0
OK1: POP AX
ADD AL,30H
MOV [BX],AL
INC BX
LOOP OK1
RET
STRY:
;显示字符数字到屏幕
MOV al,160
DEC DH
MUL DH
MOV BX,AX
DEC DL
MOV al,2
MUL DL
ADD BX,AX
MOV AX,0B800H
MOV ES,AX
MOV AH,CL
MOV CX,SI ;SI中放的是显示数据的总位数
MOV SI,0
STRY1: MOV AL,ds:[SI]
MOV ES:[BX],AL
MOV ES:[BX+1],AH
INC SI
add bx,2
LOOP STRY1
RET
code ends
END START | | |
|
|
|
|
[第1楼]
[ 回复时间:2012-05-06 23:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51 |
divdw子程序中被除数是32位的,12666放入ax,应将dx的值清零,否则,被除数并不为12666。 | | |
|
|
|
|
[第2楼]
[ 回复时间:2012-05-07 07:23 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-09-25 11:28 |
给除法子程序没关系,单步调试过了,问题出在显示子程序的写入那里有问题,,单步调试时无法写进显存,写进的数据跟从数据段调入的会自动变化,STRY1: MOV AL,ds:[SI]
MOV ES:[BX],AL
MOV ES:[BX+1],AH 这两句的问题,但不知道原因
前面的除法运算,结果在内存我调出
过,都正很正常,就算随意换取12666这个数据
内存中显示的也正常,就是写显存这里,会变化 | | |
|
|
|
|
[第3楼]
[ 回复时间:2012-05-07 09:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36 |
除法子程序有问题。
这个当检测到商为0时,则跳转了。
但是还有一个余数没有保存。
还有一个问题就是,当inc si执行后,就执行检测机制,那么,为0时,si就多了一个余数的数量值。
楼主在看看吧。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2012-05-07 12:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-09-25 11:28 |
这个确实跟除法子程序没关系,这个题目主要是输入屏幕用的,最终的除法子程序我写的结果是把12666这个数字转换成字符存入数据段地址ds的0到第4位,这个在单步调试中我已经看过了,ds:0到4显示的是12666,这个没错错误,还有楼上说的当检测到商为0时则跳转,可我这个余数在跳转前就已经压入栈了, 关于si,,这个只是作为一个计数器来用的,计算总共有多少位数,作为转化为ASCII码写进数据段的次数来用的,别无它用,最终它只累加5次,通过pop写进数据段中的前5次正好,,,这个如果感觉不对的话,可以试下更改为任意数据,最大可以达到0FFFFFFFFH,在代码开始的时候,可以加个MOV DX,0FFFFH,这个大家可以去试验下,当除法子程序写进数据段操作完成 后,可以在debug中查看下,跟你所要表达的数据会完全一样。 这题的问题在于写屏时 标号STRY1那里写屏的次数也是引用的si的值,这个跟上面转换ASCII的原理一样,单步调试到这里时,数据段内存中的值,没任何变化,唯 独写进显存,就不是实际内存中的数了。 总感觉有地方错,就是不知道那里,麻烦高手们调试下,给个结果,谢谢 | | |
|
|
|
|
[第5楼]
[ 回复时间:2012-05-07 13:05 ]
[引用]
[回复]
[ top ] | |
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36 |
|
|
|
|
|
[第6楼]
[ 回复时间:2012-05-07 13:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-09-25 11:28 |
|
|
|
|
|
[第7楼]
[ 回复时间:2012-05-07 13:37 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-09-25 11:28 |
下午有时间看看吧。
------------------
回复:谢了,兄弟,原因我找到了,估计就是一坑,日了,把标号STRY1随便换了个名字,就正确了,当初我也是随便命名的,都没多想。。。。。。。。。。。。。。。。。。。。。。 | | |
|
|
|
|
[第8楼]
[ 回复时间:2012-05-07 14:18 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:2
注册日期:2011-09-25 11:28 |
此贴由 贴主 于 [ 2012-05-07 14:18 ] 结贴。 结贴原因:问题已解决 | | |