汇编语言(第3版,王爽著):实验9 根据材料编程

实验9 根据材料编程

1. 解题思路:

80x25 彩色字符模式显示缓冲区 效果图

通过分析可以得到最后展示效果的起始行和列的大致位置:
第 12 行的起始地址:11 * 80 * 2 = 1760 = 06E0H
第 13 行的起始地址:11 * 80 * 2 + (80 * 2)
第 14 行的起始地址:11 * 80 * 2 + (2 * 80 * 2)
列的起始地址为:32 * 2 = 64 = 40H
因此可以使用 相对基址变址寻址(即 [bx + idata + si]) 的方式来定位内存地址

2. 在 debug 环境下调试,更改显示缓冲区里的内容:

更改第 12 行的内容,因为不断地输入字符,终端会一直滚屏,所以一般不建议 debug 模式下更改第一行的内容
在 debug 环境下,更改显示缓冲区里的内容

在 debug 环境下,更改显示缓冲区里的内容2

3. 代码实现:

assume cs:codesg

datasg segment
    db 'welcome to masm!'
datasg ends

codesg segment
start:  mov ax, datasg
        mov ds, ax
        mov bx, 0

        mov ax, 0b800H                      ; 显示缓冲区的段地址
        mov es, ax
        mov bp, 1760                        ; 屏幕中间,第 12 行的起始地址 11 * 80 * 2
        mov si, 0

        mov cx, 16                          ; 要显示的有 16 个字符,所以循环 16 次
    s:  mov ah, 00000010B                   ; 黑底绿色 00000010B = 02H
        mov al, ds:[bx]                     ; ax 的低位字节存储字符的 ASCII 码,高位字节存储字符的属性
        mov es:[bp + 64 + si], ax           ; 第 12 行

        mov ah, 00100100B                   ; 绿底红色 00100100B = 24H
        mov al, ds:[bx]
        mov es:[bp + 160 + 64 + si], ax     ; 第 13 行

        mov ah, 01110001B                   ; 白底蓝色 01110001B = 71H
        mov al, ds:[bx]
        mov es:[bp + 320 + 64 + si], ax     ; 第 14 行

        inc bx
        add si, 2

        loop s

        mov ax, 4c00H
        int 21H
codesg ends

end start

4. exe 文件运行过程的展示:

exe 文件运行过程的展示

或输入 cls 将画面清空,再运行 exe 文件,这时能看得清楚
C:\>cls

exe 文件运行过程的展示2

posted @ 2022-05-26 12:59  夏夜星空晚风  阅读(50)  评论(0编辑  收藏  举报