Zero_One 发表于 2012-5-6 14:49:43

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

本帖最后由 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 ,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:
                MOV ES:,AL          ;单步调试到这里出的问题,无法写进显存
                MOV ES:,AH      ;请高手帮忙分析下下,弄不明白
                INC SI
               add bx,2
               LOOP STRY1
               RET
               
code ends
END START麻烦高手们给看下,输出到屏幕的结果不对,单部调试没问题,除法运算时也没问题

Zero_One 发表于 2012-5-7 13:39:20

本帖最后由 Zero_One 于 2012-5-7 14:26 编辑

邪 乎。邪乎。

群益电脑 发表于 2012-5-9 10:35:00

                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应该为零吧。我们应检测的是商是否为零,若为零才跳转,将余数存入内存

Zero_One 发表于 2012-5-9 14:13:16

群益电脑 发表于 2012-5-9 10:35 static/image/common/back.gif
mov dh,3         ;定义第三行

                mov dl,4         ;定义第四列


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

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

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

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

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

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

存在一直变化,是不是处理器工作原理我们有不知道的地方。?????
页: [1]
查看完整版本: 第十章 实验十第三题 ,显示12666在屏幕