鱼C论坛

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

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

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

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

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

x
本帖最后由 Zero_One 于 2012-5-7 22:25 编辑
  1. assume cs:code,ds:data,ss:stack
  2. data segment
  3.     dw 8 dup (0)
  4. data ends
  5. stack segment
  6.     dw 8 dup(0)
  7. stack ends
  8. code segment
  9. start:
  10.         mov ax,data
  11.                 mov ds,ax
  12.                 mov ax,stack
  13.                 mov ss,ax
  14.                
  15.                 MOV AX,12666
  16.                 mov si,0
  17.                
  18.                 call near ptr divdw
  19.                
  20.                 mov dh,3           ;定义第三行
  21.                 mov dl,4           ;定义第四列
  22.                 mov cl,00000010b   ;显示效果为黑底绿字
  23.                
  24.                 CALL near ptr STRY
  25.                
  26.                 mov ax,4c00h
  27.                 int 21h
  28.      divdw:  
  29.         PUSH AX
  30.          mov ax,dx          ;将被除数高16位存入AX,先进行高16位的运算
  31.                 mov dx,0           ;被除数高16置0
  32.                 mov cx,10          ;设置除数为10
  33.                 DIV CX
  34.                 MOV BX,AX          ;高16位的商暂存BX
  35.                 POP AX
  36.                 DIV CX
  37.                 PUSH DX           ;最终算出的余数,压入栈中
  38.                 MOV DX,BX
  39.                 INC SI               ;用来计算数据的总位数
  40.                
  41.                 MOV CX,AX
  42.                 JCXZ OK
  43.                JMP DIVDW
  44.                
  45. OK:     MOV CX,SI              ;将数据总位数确定为循环次数
  46.            MOV BX,0
  47. OK1:    POP AX
  48.            ADD AL,30H
  49.            MOV [BX],AL           INC BX
  50.            LOOP OK1
  51.            RET
  52.                
  53. STRY:                                  ;显示字符数字到屏幕
  54.         MOV al,160
  55.         DEC DH
  56.         MUL DH
  57.         MOV BX,AX
  58.         DEC DL
  59.         MOV al,2
  60.         MUL DL
  61.         ADD BX,AX                ;确定输出显存位置坐标
  62.             
  63.   
  64.         MOV AX,0B800H          ;定义es段为显存段地址
  65.                 MOV ES,AX
  66.                 MOV AH,CL            ;将字体颜色存入AH
  67.                
  68.                 MOV CX,SI           ;SI中放的是显示数据的总位数
  69.                
  70.                 MOV SI,0
  71. STRY1:  MOV AL,ds:[SI]
  72.                 MOV ES:[BX],AL          ;单步调试到这里出的问题,无法写进显存
  73.                 MOV ES:[BX+1],AH      ;请高手帮忙分析下下,弄不明白
  74.                 INC SI
  75.                add bx,2
  76.                LOOP STRY1
  77.                RET
  78.                
  79. code ends
  80. END START
复制代码
麻烦高手们给看下,输出到屏幕的结果不对,单部调试没问题,除法运算时也没问题
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-5-7 13:39:20 | 显示全部楼层
本帖最后由 Zero_One 于 2012-5-7 14:26 编辑

邪 乎。邪乎。
小甲鱼最新课程 -> https://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应该为零吧。我们应检测的是商是否为零,若为零才跳转,将余数存入内存
小甲鱼最新课程 -> https://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那里写进显存时,不能正确执行,单步调试时,显

存在一直变化,是不是处理器工作原理我们有不知道的地方。?????
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-6 04:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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