- [tomato] MOV BX,0B800H MOV ES,BX MOV 04/17 15:26
- [游客] 程序有问题,你的返回指令处 MOV AH,4C 这条指令丢了H了,所以数据就不对了。 04/15 11:28
- [游客] 结论正确。第一题的原因是? 04/15 11:20
- [游客] 回答OK。 04/15 10:24
- [游客] 没问题。想显示完全年份的话,可以搜搜博客中的文章,有提到的。 04/15 10:10
- [游客] 理解OK。 04/15 09:00
- [bslg123] 支持一下! 04/13 10:01
- [caroline0712] 3ks 已经改正 04/08 15:18
- [crazyman] 监测点16.2第二个空不对。仔细看看assume关联。 04/07 21:25
- [caroline0712] ;数值显示 改进版()显示部分的改进) ;将DATA中的数据以十进制显示; ;将二进制信息存储 03/30 15:47
[2009-03-28 08:55] 第十章实验十程序三
;将DATA中的数据以十进制显示;
;将二进制信息存储的数据变为十进制形式的字符串
;
DATAS SEGMENT
DB 6 DUP (0);用AX存储数据,最大为5位 ,所以分配6个db
DATAS ENDS
STACKS SEGMENT
DW 14 DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,12666
MOV BX,DATAS
MOV DS,BX
MOV SI,0
CALL DTOC
MOV DH,8
MOV DL,3
MOV CL,01110001B
CALL show_str
MOV AH,4CH
INT 21H
DTOC:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
DTOC_START:
MOV DX,0 ;
MOV BX,10
DIV BX
MOV CX,AX
ADD DX,30H
INC SI
PUSH DX
JCXZ DTOC_END
INC cx
LOOP DTOC_START
DTOC_END:
MOV CX,SI
MOV SI,0
TURN:
POP DX
MOV DS:[SI],DL
INC SI
LOOP TURN
MOV DS:[SI],0H
POP SI
POP DX
POP CX
POP BX
POP AX
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SHOW_STR:
;把用到的寄存器入栈
PUSH AX
PUSH DX
PUSH SI
PUSH CX
;和显存关联
MOV AX,0B800H
MOV ES,AX
mov SI,0
MOV BX,0
MOV AL,CL;将颜色设置到AL中
s:
MOV CL,DS:[SI]
MOV CH,0
JCXZ OK ;判断是否为0
;输出几列 循环几次
PUSH DX
MOV CL,DL
MOV DH,0
MOV CX,DX
PUSH CX
MOV DI,DX
SUB DI,DI
CONT:
PUSH CX ;CONT 计数
MOV CL,DS:[SI]
mov ES:[DI][BX],CL;传数据
MOV ES:[DI+1][BX],AL;设置颜色
INC SI
ADD DI,2
POP CX
LOOP CONT
ADD BX,16
POP CX
POP DX
LOOP S
OK: POP CX
POP SI
POP DX
POP AX
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODES ENDS
END START
[ crazyman 发表于 2009-03-30 15:26 ]
你的程序还存在编译错误。另外,通过观察你的程序,也许只实现了dx为0的32位除法,对于dx大于0aH的数据,应该同样存在溢出错误的。当然,这是对程序的一个更高的要求,因为后面的课程设计会用到这个子程序功能,所以,在完成12666基本的数据要求后,考虑改进一下,让程序适应更大的数据。
[ caroline0712 发表于 2009-03-30 15:42 ]
回复Crazyman:你编译的方法对吗?我编译没有错误
[ caroline0712 发表于 2009-03-30 15:47 ]
;数值显示 改进版()显示部分的改进)
;将DATA中的数据以十进制显示;
;将二进制信息存储的数据变为十进制形式的字符串
;
DATAS SEGMENT
DB 6 DUP (0);用AX存储数据,最大为5位 ,所以分配6个db
DATAS ENDS
STACKS SEGMENT
DW 14 DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,12666
MOV BX,DATAS
MOV DS,BX
MOV SI,0
CALL DTOC
MOV DH,8
MOV DL,3
MOV CL,01110001B
CALL show_str
MOV AH,4CH
INT 21H
DTOC:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
DTOC_START:
MOV DX,0 ;
MOV BX,10
DIV BX
MOV CX,AX
ADD DX,30H
INC SI
PUSH DX
JCXZ DTOC_END
INC cx
LOOP DTOC_START
DTOC_END:
MOV CX,SI
MOV SI,0
TURN:
POP DX
MOV DS:[SI],DL
INC SI
LOOP TURN
MOV DS:[SI],0H
POP SI
POP DX
POP CX
POP BX
POP AX
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SHOW_STR:
PUSH AX
PUSH SI
PUSH CX
PUSH DX
MOV AX,0B800H
MOV ES,AX
MOV AX,160
MUL DH
ADD DL,DL
MOV DH,0
ADD AX,DX
MOV DI,AX
MOV SI,0
MOV AL,CL
;判断是否是0,终止
JUDGE:
MOV CL,DS:[SI]
MOV CH,0
JCXZ COPYDATAEND
MOV ES:[DI],CL
MOV ES:[DI+1],AL
ADD SI,1
ADD DI,2
INC CX
LOOP JUDGE
COPYDATAEND:
POP DX
POP CX
POP SI
POP AX
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODES ENDS
END START