|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
assume cs:codesg,ds:datasg,ss:stack
datasg segment
db 'welcome to masm '
db 71h,24h,02h
datasg ends
stack segment
db 8 dup(0)
stack ends
codesg segment
start:
;初始化栈段寄存器和sp寄存器
mov ax,stack
mov ss,ax
mov sp,08h
;初始化数据段寄存器
mov ax,datasg
mov ds,ax
;启用es寄存器,将显示第一行正中央作为段的起始地址
mov ax,0b872h
mov es,ax
;外层循环三次,用来打印三行字符
mov cx,3
;si寄存器将会用做es上的偏移,也就是控制打印第几行
mov si,0
;内层循环用来循环打印每个字符,循环开始首先保存寄cx寄存器,保证外层循环可以运行
s0: push cx
mov di,cx
;这里外层的cx数值是3,2,1正好对应三个颜色的偏移,所以用di保存cx的值用于偏移
;bx用于控制字符的偏移
mov bx,0
;ax寄存器高位放颜色,低位保存字符的asci
mov ah,ds:[0Fh+di]
;要打印的字符一共16个循环16次
mov cx,16
s:
;因为写入显存控制显示的字符的时候,需要先写入字符,再写入字符asci,再写入颜色方案,每个字符控制消耗1个字
;所以bx寄存器每次增长2,也就是2,4,6,8,但是访问要显示的字符的时候每一次只需要移动一个welcom,bx为1,2,3,4,
;可以看到是2倍关系,右移可实现
shr bx,1
mov al,byte ptr ds:[bx]
;左移恢寄存器的值
shl bx,1
;ax全部写入寄存器
mov word ptr es:[bx+si],ax
add bx,2
loop s
;向下偏移一行
add si,0A0h
;到外层循环,恢复cx
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
|
|