DATA SEGMENT
DW 123,12666,1,8,3,38
DATA ENDS
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX
MOV SI,12 ;SI用来寻址,12=存储的第一个字符串的首地址
MOV CX,6 ;循环次数6次
MOV BX,0 ;用 [BX]指向第一个word型数据
s1:
MOV AX,DS:[BX]
CALL DTOC ;把(AX)中的word型数据转化成数字的ASCII码,
ADD BX,2
CALL NEXT_WORD
LOOP s1
MOV SI,12 ;将SI指向存储的第一个字符串的首地址
MOV DH,8 ;行号:0
MOV DL,3 ;列号:0
MOV CX,6 ;循环次数为6,总共要输出6个字符串
SHOW_ALL:
PUSH CX
MOV CL,2 ;绿色
CALL SHOW_STR
CALL NEXT_WORD
INC DH
POP CX
LOOPSHOW_ALL
MOV AX,4C00H
INT 21H
DTOC PROC NEAR
PUSH BX
PUSH DX
PUSH CX
PUSH AX
PUSH SI
MOV BX,0 ;BX用来计数,转化了多少位数字
DECIMAL_PLACE:
MOV DX,0
MOV CX,10
DIV CX
ADD DX,30H ;数字转化为ASCII码
PUSH DX
INC BX
CMP AX,0
JNE DECIMAL_PLACE
MOV CX,BX ;(CX)=循环次数
TRANSFER:
POP DX ;弹出一位数字的ASCII码
MOV [SI],DL
INC SI
LOOP TRANSFER
MOV AX,0
MOV [SI],AL
POP SI
POP AX
POP CX
POP DX
POP BX
RET
DTOC ENDP
SHOW_STR PROC NEAR
PUSH AX
PUSH ES
PUSH DX
PUSH DI
PUSH SI
MOV AX,0B800H
MOV ES,AX
MOV AL,0A0H ;计算初始字符的偏移地址
MUL DH ;行数×0A0H(160个字节)
MOV DI,AX ;转移到DI中
MOV AL,2 ;显示缓冲区中一个字符占两个字节空间
MUL DL
ADD DI,AX ;获得初始字符的偏移地址
S:
MOV AX,DS:[SI] ;输出字符到显示缓冲区
MOV ES:[DI],AX
INC DI
MOV ES:[DI],CL ;写入颜色信息
INC SI
PUSH CX ;保存颜色=(CL)
MOV CX,DS:[SI]
MOV CH,0 ,
JCXZ END_SHOW
POP CX
INC DI
JMP S
END_SHOW:
POP CX
POP SI
POP DI
POP DX
POP ES
POP AX
RET ;返回
SHOW_STR ENDP
NEXT_WORD PROC NEAR
PUSH AX ;保护现场
ZERO_OR_NOT:
MOV AX,[SI]
MOV AH,0 ;
CMP AX,0 ;是不是结尾符0
JEEND_OF_NUM_STRING
INC SI
JMPZERO_OR_NOT
END_OF_NUM_STRING:
INC SI
POP AX
RET ;返回
NEXT_WORD ENDP
CODE ENDS