maikehong 发表于 2023-7-24 03:07:22

实验测试9显示 换汤不换药



;显存地址 B8000H 开始 BFFFFH 共32kb空间共8页 每页4kb
;第一页显示偏移
;000~09F显示第一行
;0A0~13F显示第二行
;显存可以25行 每行80个字符 每个字符2个字节 = 160字节
;每个字符占一个字 低位字符存储ASCII高位字存储属性
;这里从第11开始160*11 = 6E0
;每个中间开始 80字符-16字符/2各半 * 2个字节 = 40H
;那么起始位置是在 B8000H+6E0+40H = B8720 开始
assume cs:code

code segment

        db 'welcome to masm!'                ;定义要显示的字符串(共16个字节)
        col db02h,24h,71h                                ;定义三种颜色属性
        dw 8 dup(0)
start:

                pushax
                pushbx
                pushcx
                push si
                push di
               
                call show

                mov ax, 4c00h
                int 21h
show:               

                mov ax, cs
                mov ds, ax
               
                mov ax, cs
                mov ss, ax
                mov sp, offset start
               
                xor bx,bx                        ;bx清零,用来索引颜色
                mov ax,0b872h                ;算出屏幕第12行中间的显存的段起始位置放入ax中;把后面0扔了
               
                mov cx, 3                        ;S3循环控制行数,外循环为3次,因为要显示三个字符串
               
s3:                push cx                        ;
                push ax                        ;三个进栈操作为外循环s3保存相关寄存器的值
                ; push bx                        ;以防止它们的值在内循环中被破坏
               
                mov es, ax                        ;此时es为屏幕第12行中间的显存的段起始位置
               
                mov si, 0                        ;源头字符串
                mov di, 0                        ;定位目标列
               
               
                mov cx, 10h                        ;十6个字符串 内循环
s1:                mov al,                         ;源地址 数据
                mov ah, col                        ;源地址 属性
                mov es:, al                        ;目标显存地址
                mov es:, ah                ;目标显存属性
                inc si
                add di, 2
                loop s1                                ;此循环实现偶地址低位字符存储ASCII 字符
                add bx, 1

                pop ax
                add ax, 0ah                        ;mov ax,0b872h 前面把这个设置位启动段地址了 加偏移就好
                pop cx
                loop s3

                popdi
                popsi
                popcx
                pop bx
                pop ax
               
                ret
       

code ends
end start




页: [1]
查看完整版本: 实验测试9显示 换汤不换药