| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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 
                 |   
 
 
 
 |