汇编语言(第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