yeep 发表于 2021-8-11 11:36:06

实验9一种更快更好的思路

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:
                ;要打印的字符一共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:
                ;左移恢寄存器的值
                shl bx,1
                ;ax全部写入寄存器
                mov word ptr es:,ax
                add        bx,2
                loop s
                ;向下偏移一行
                add si,0A0h
                ;到外层循环,恢复cx
                pop cx
                loop s0
               
                mov ax,4c00h
                int 21h
               
codesg ends
end start
               
页: [1]
查看完整版本: 实验9一种更快更好的思路