第十章 实验十第三题 ,显示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 14:26 编辑
邪 乎。邪乎。
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应该为零吧。我们应检测的是商是否为零,若为零才跳转,将余数存入内存 群益电脑 发表于 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]