|
楼主 |
发表于 2014-4-23 22:11:35
|
显示全部楼层
ASSUME CS:CODE,DS:DATA,SS:STACK
DATA SEGMENT
DB 'wlcome to masm!'
DB 02H,24H,71H
DATA ENDS
STACK SEGMENT
DW 8 DUP(0)
STACK ENDS
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV SP,10H
XOR BX,BX ;相当于mov bx,0 BX清零 用来索引颜色
MOV AX,0B872H ;算出屏幕第12行中间的显存的段起始位置放入ax中
MOV CX,3
S3: ;S3循环控制行数,外循环为3次,因为要显示三个字符串
PUSH CX ;三个进栈操作为外循环S3保存相关寄存器的值
PUSH AX ;以防止它人的值在内循环中被破坏
PUSH BX
MOV ES,AX ;此时ex为屏幕第12行中间的显存的段的起始位置
MOV SI,0 ;si用来索引代码列的字符
MOV DI,0 ;di用来定位目标列
MOV CX,10H
;S1循环控制存放的字符,内循环为10次,因为一个字符串中含有10H个字
S1:
MOV AL,DS:[SI]
MOV CS:[DI],AL
INC SI
ADD DI,2 ;此循环实现偶地址中存放字符
MOV DI,1 ;di的值设为1,从而为在显存奇地址中存放字符颜色做准备
POP BX
MOV AL,DS:10[BX] ;取颜色属性
INC BX
MOV CX,10H ;第二个内循环也为10H次
S2:
MOV ES:[DI],AL
ADD DI,2
LOOP S2 ;此循环实现奇地址中存放字符的颜色属性
;以下4句为下一趟外循环做准备
POP AX
ADD AX,0AH ;将显存的段起始地址设为当前行的下一行
;[在段地址中加0ah,相当于在偏移地址中加了0a0h=160d]
POP CX
LOOP S3
MOV AX,4C00H
INT 21H
CODE ENDS
END START
|
|