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

1. 解题思路:

通过分析可以得到最后展示效果的起始行和列的大致位置:
第 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 模式下更改第一行的内容


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 文件运行过程的展示:

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

 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号