9、实验九
思路大概就是一个大循环(s0)两个小循环(s1、s2),大循环执行三次,内嵌两个小循环,每一次大循环结束后,均会完成一行的字母和属性复制到目的地址。两个小循环的作用分别是复制字符到目的地址(s1)和复制字符属性到目的地址(s2)
代码如下(https://blog.csdn.net/GSW_Stephen/article/details/106970720):
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db 'welcome to masm!' ;16B
db 02h,24h,71h ;对应颜色
datasg ends
stacksg segment
dw 8 dup(0)
stacksg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov ax,stacksg
mov ss,ax
mov sp,10h
mov bx,0
mov ax,0b872h ;定位到屏幕中间位置
mov cx,3
s0:
push cx
push ax
push bx
mov es,ax ;数据的目的段地址
mov si,0 ;源偏移地址
mov di,0 ;目的偏移地址
mov cx,10h ;共16B,循环16次
s1:
mov al,ds:[si]
mov es:[di],al
inc si
add di,2
loop s1 ;按行复制字母
mov di,1 ;准备复制颜色到目的地址
pop bx
mov al,ds:10h[bx] ;颜色所在的源地址内容复制到al
inc bx
mov cx,10h
s2:
mov es:[di],al
add di,2
loop s2 ;将颜色复制到目的地址
pop ax
add ax,0ah
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
将上述代码编译连接,运行效果如下: