curry_abc 发表于 2018-12-20 19:54:16

实验9

assume cs:codesg

data segment
        db 'welcome to masm!'
        db 02h,24h,71h
data ends

stack segment
        dw 8 dup(0)
stack ends

codesg segment
        start:        mov ax,stack
                        mov ss,ax
                        mov sp,16                ;初始化栈
                        mov ax,0b872h
                        mov es,ax                ;初始化扩展段,指向待写入的显存地址
                        mov ax,data
                        mov ds,ax                ;ds指向待写入的数据
                       
                        mov cx,3
                        mov bx,0
                        mov si,0
                        mov di,0
                        mov dx,0                ;循环初始化
                       
                s1:        push cx                        ;由于内层有嵌套循环,将外层循环的cx推入栈中暂存
                        mov cx,16
                s:        mov al,ds:        ;将数据段中的字符数据取出,写入ax低位
                        mov ah,ds:10h        ;将数据段中的字符显式属性取出,写入ax高位(同一行的字符属性相同)
                        mov es:,ax                ;将字符数据和字符属性同时写入指定缓存区域
                        inc si                                ;si是源数据地址的偏移地址,+1指向下一个字符
                        add di,2                        ;di是待写入显存的偏移地址,+2指向下一个显式字符的地址
                        loop s
                       
                        pop cx                                ;取出外层循环的值
                        mov si,0
                        mov di,0                        ;偏移地址清零,准备写入下一行数据
                        add dx,0a0h                        ;dx记录移动到下一行需要的偏移
                        add di,dx                        ;偏移地址指向下一行
                       
                        inc bx                                ;bx控制写入的字符属性
                        loop s1
                       
                        mov ax,4c00h
                        int 21h
codesg ends

end start
页: [1]
查看完整版本: 实验9