鱼C论坛

 找回密码
 立即注册
查看: 2360|回复: 3

第十章 实验十第三题 ,显示12666在屏幕

[复制链接]
发表于 2012-5-6 14:49:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Zero_One 于 2012-5-7 22:25 编辑
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          ;定义es段为显存段地址
                MOV ES,AX
                MOV AH,CL            ;将字体颜色存入AH
                
                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
麻烦高手们给看下,输出到屏幕的结果不对,单部调试没问题,除法运算时也没问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-5-7 13:39:20 | 显示全部楼层
本帖最后由 Zero_One 于 2012-5-7 14:26 编辑

邪 乎。邪乎。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-9 10:35:00 | 显示全部楼层

回帖奖励 +5 鱼币

                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位的运算

现在DX的值应该是DH=3,DL=4吧,并且把这个值给AX/10。你的目的是将12666分离,12666AX也可保存,高位DX应该为零吧。我们应检测的是商是否为零,若为零才跳转,将余数存入内存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-5-9 14:13:16 | 显示全部楼层

原因已经找到了,但不是你上面说的这个原因,你说的上面这些在写入寄存器前,
除法运结果已经完全写进内存吧了,虽然变量定义有些乱。

真正的原因是,在初始状态时,,MOV AX,12666前面或后面加上MOV DX,0就正确了

就算最大值 FFFFFFFF,AX,0FFFFH,BX,0FFFFH都能正确执行

就是不理解而己,虽然我进行的是16位运算,DX的值我不进行初始值为0,也应该代表初始值是0才对

并且在单步调试中,显示的值始终是0在作为运算,除法运算结束,到写进内存那里,都正常,内存中

被写进的12666ASCII码查询也正确,唯 独到ESb800那里写进显存时,不能正确执行,单步调试时,显

存在一直变化,是不是处理器工作原理我们有不知道的地方。?????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-20 04:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表