DATAS SEGMENT
db 10 dup(0)
DATAS ENDS
STACKS SEGMENT
DW 10 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
;======================================================
;以下代码分别设置行号8,列号3,以及颜色2(绿色)
MOV DH,8
MOV DL,3
MOV CL,2
;以下代码设置DS:[SI]指向数据段的第一个字节,即'w'
MOV AX,DATAS
MOV DS,AX
MOV SI,0
;初始化堆栈段
MOV AX,STACKS
MOV SS,AX
MOV SP,20
;调用子程序
CALL SHOW_STR
MOV AH,4CH
INT 21H
MOV AH,4CH
INT 21H
SHOW_STR:
;保存寄存器的值
PUSH AX
PUSH CX
PUSH DX
PUSH SS
PUSH SP
;设置显存的断地址
MOV AX,0B800H
MOV ES,AX
;下面计算偏移地址,计算公式为:80×(r-1)×2+(c-1)×2 = 160×r+2×c-162 (其中r为行row,列为column)
;先计算160*r的值,把其储存到BX中
MOV AL,160
MUL DH
MOV BX,AX
;在计算2*c,其值存储在AX中
MOV AL,2
MUL DL
ADD AX,BX
SUB AX,162
;把偏移地址储存在DI中
MOV DI,AX
MOV AL,CL
COPY:
MOV CL,DS:[SI]
MOV CH,0
JCXZ RETURN_SHOW_STR
MOV ES:[DI],CL
MOV ES:[DI+1],AL
ADD SI,1
ADD DI,2
JMP COPY
RETURN_SHOW_STR:
POP SP
POP SS
POP DX
POP CX
POP AX
RET
;===========================================================================
DTOC:
PUSH AX
PUSH BX
PUSH DS
PUSH SI
MOV BX,10
TOSTRING:
MOV DX,0
DIV BX
MOV CX,AX
ADD DX,30H
PUSH DX
INC SI
JCXZ REV
JMP TOSTRING
REV:
MOV CX,SI
MOV SI,0
S:
POP AX
DEC CX
MOV BYTE PTR [SI],AL
INC SI
JCXZ RETURN_DTOC
JMP S
;上面的数子的字符形式是反对,下面对其纠正
RETURN_DTOC:
POP SI
POP DS
POP BX
POP AX
RET
CODES ENDS
END START
- [游客] up~ 06/24 16:28
- [游客] 不错,加油~ 06/23 15:35
- [ptr] OV over flow NV no over flow 06/13 17:12
- [younggay] 首先恭喜博主完成课程设计一(虽然没有将全部的信息都显示完全),其实,做程序,尤其是设计一,我们最大的 06/10 17:25
- [tomato] 刚开始做思路是混乱的,多看几遍,多顺几遍思路,自然就知道怎么优化了。 06/10 16:45
- [游客] 正确。 06/10 16:31
- [ptr] 哈哈,真服了这位大哥,这么乱的代码…… 06/10 14:38
- [游客] 嗯。完成任务。 06/08 14:30
- [游客] 真够会偷懒的。呵呵 程序没问题。 06/08 11:02
[ 游客 发表于 2009-06-08 14:30 ]
嗯。完成任务。