王爽《汇编语言》实验10.1——显示字符串

来源:互联网 发布:萨德部署完成 知乎 编辑:程序博客网 时间:2024/05/17 22:13

;====================================================================

;子程序SHOW_STR功能;在指定的位置,用指定的颜色,显示一个用0结尾的字符串。

;====================================================================

ASSUMECS:CODE,DS:DATA

 

DATASEGMENT

   DB'Welcome to masm!',0

DATAENDS

 

CODESEGMENT

START:

   MOVDH,8       ;(DH)=行号(0~24)

   MOVDL,3       ;(DL)=列号(0~79)

   MOVCL,2       ;(CL)=颜色

   MOVAX,DATA    ;初始化DS

   MOVDS,AX

   MOVSI,0       ;初始化SI,DS:SI指向字符串的首地址

   CALL SHOW_STR   ;调用子程序

 

   MOVAX,4C00H

   INT21H

 

;-----------------------------------------------------------------------

;功能:在指定的位置,用指定的颜色,显示一个用0结尾的字符串。

;参数:(DH)=行号(0~24),(DL)=列号(0~79),(CL)=颜色,DS:SI指向字符串的首地址。

;返回:

SHOW_STR:

   PUSHAX            ;保护现场

   PUSHES

   PUSHDX

   PUSHDI

   PUSHSI

   MOVAX,0B800H      ;显示缓冲区段地址

   MOVES,AX          ;(ES)=显示缓冲区段地址

   MOVAL,0A0H        ;以下计算初始字符的偏移地址

   MULDH             ;行数×0A0H(160个字节)

   MOVDI,AX          ;转移到DI

   MOVAL,2           ;显示缓冲区中一个字符占两个字节空间

   MULDL             ;2×列号

   ADDDI,AX          ;获得初始字符的偏移地址

   S:

   MOVAX,DS:[SI]     ;输出字符到显示缓冲区

   MOVES:[DI],AX

   INCDI             ;准备写入颜色信息

   MOVES:[DI],CL     ;写入颜色信息

   INCSI             ;准备输出下一个字符

   PUSHCX            ;保存颜色=(CL)

   MOVCX,DS:[SI]     ;(CX)=下一个字符

   MOVCH,0           ;!!!DS:[SI]的低位字节为零,但其高位字节不为零,

                       ;!!!则程序不能如期望的那样跳转到END_SHOW

   JCXZ END_SHOW       ;不为零则继续输出,为零则结束子程序

   POPCX             ;恢复颜色=(CL)

   INCDI             ;准备写入下一个字符

   JMP S               ;输出下一个字符

   END_SHOW:

   POPCX             ;!!!如果(CX)≠0,就会跳转到这里,此时(CX)在栈中还没有弹出

                       ;!!!如果不弹出就会引发错误

   POPSI             ;恢复现场

   POPDI

   POPDX

   POPES

   POPAX

   RET

;------------------------------------------------------------------------

           

CODEENDS

END START

0 0
原创粉丝点击