. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10.3,  12666  写屏时无法进行写入(单步调试),显示不相符,求原因  [已解决] 回复[ 8次 ]   点击[ 369次 ]  
zero_one
[帖 主]   [ 发表时间: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
tomato
[第1楼]   [ 回复时间:2012-05-06 23:06 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
divdw子程序中被除数是32位的,12666放入ax,应将dx的值清零,否则,被除数并不为12666。
zero_one
[第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这个数据
                                                           内存中显示的也正常,就是写显存这里,会变化
fpamc
[第3楼]   [ 回复时间:2012-05-07 09:03 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
除法子程序有问题。

这个当检测到商为0时,则跳转了。
但是还有一个余数没有保存。

还有一个问题就是,当inc si执行后,就执行检测机制,那么,为0时,si就多了一个余数的数量值。


楼主在看看吧。
zero_one
[第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的原理一样,单步调试到这里时,数据段内存中的值,没任何变化,唯 独写进显存,就不是实际内存中的数了。   总感觉有地方错,就是不知道那里,麻烦高手们调试下,给个结果,谢谢
fpamc
[第5楼]   [ 回复时间:2012-05-07 13:05 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
下午有时间看看吧。
zero_one
[第6楼]   [ 回复时间:2012-05-07 13:18 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-09-25 11:28
谢谢楼上!!!!
zero_one
[第7楼]   [ 回复时间:2012-05-07 13:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-09-25 11:28
下午有时间看看吧。
------------------
回复:谢了,兄弟,原因我找到了,估计就是一坑,日了,把标号STRY1随便换了个名字,就正确了,当初我也是随便命名的,都没多想。。。。。。。。。。。。。。。。。。。。。。
zero_one
[第8楼]   [ 回复时间:2012-05-07 14:18 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2011-09-25 11:28
此贴由 贴主 于 [ 2012-05-07 14:18 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(tomato):7分   5楼(fpamc):7分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved