汇编语言实验十-三

时间:2021-10-24 01:08:03

程序清单:
ASSUME CS:CODE,DS:DATA

 

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

END START