网站html下载,出入沈阳最新通知今天,wordpress插件外贸,百度没有收录我的网站《汇编语言》- 读书笔记 - 实验9 根据材料编程 需求所需的相关知识属性字节每一位的含义 分析字符位置属性 解答思路代码 效果 需求
在屏幕中间分别显示 绿色、绿底红色、白底蓝色 的字符串 welcome to masm!。
所需的相关知识
80x25 彩色字符模式显示缓冲区(以下简称为显示… 《汇编语言》- 读书笔记 - 实验9 根据材料编程 需求所需的相关知识属性字节每一位的含义 分析字符位置属性 解答思路代码 效果 需求
在屏幕中间分别显示 绿色、绿底红色、白底蓝色 的字符串 welcome to masm!。
所需的相关知识
80x25 彩色字符模式显示缓冲区(以下简称为显示缓冲区)的结构:
内存地址 B8000H ~ BFFFFH 共32KB为 80x25 彩色字符模式的显示缓冲区。 1.1. 向这段内存写数据内容将立即出现在显示器上。显示缓冲区共32KB可分为 8页每页内容占 4KB(≈4000B)。这里的页是指显示屏 2.1. 默显示第 0 页 B8000H ~ B8F9FH 。 2.2. 每页可显示 25行每行 80字符。共160字节 2.3. 每个字符占2字节低8位存 ASCII高8位存属性。 2.4. 每个字符可以有256 种属性(背景色、前景色、闪烁、高亮等组合信息)。
属性字节每一位的含义 分析
字符位置
简单计算一下居中的位置 行25/2 - 3/2 11 列80/2 - welcome to masm!.length / 2 32 第11行32字符坐标B867E ~ B867F
/*** 计算字符在 80x25 字符模式下的位置* rows 第几行* column 第几个字符* start 显示缓冲区起始位置默认 0xB8000*/
function getOffset( _rows, _column, start0xB8000){let rows _rows - 1;let column _column - 1;return (start 160 * rows column * 2).toString(16).toUpperCase();
}
getOffset(11, 32) // B867E
getOffset(11, 32, 0) // 67E属性 解答
思路
遍历源字符串数据段复制到 目标内存中显示缓冲区。
先在数据段中定义源字符串 welcome to masm!。遍历字符串向目标写入数据。字符串长度16固定用 立即数 写入 cx。居中显示我从第11行第32字符开始 B867E初始偏移值 67E 用 立即数 写入 bx 备用。第一二三行偏移量用立即数表示分别为0160320 第一行第一个字符B867E 0 字节 第二行第一个字符B867E 160字节 第三行第一个字符B867E 160字节 160字节目标字符偏移量用 di 表示初始为0每轮循环结束前 2。显示每个字符占2字节先在 AX 中装配好字符再写入显示缓冲区对应的位置上。 6.1. 先将字符读到 al 6.2. 再按所在行将属性写入ah。 6.3. 最后一起写入内存。
代码
assume cs:code, ds:data
data segmentdb welcome to masm! ; 源字符串
data endscode segmentstart: mov ax,data ; 初始化数据段地址读字符串mov es,axmov ax,0B800h ; 初始化显存段地址mov ds,ax mov cx,16 ; 字符串长度 16 就是循环处理次数mov si,0 ; 源字符串偏移量mov bx,67Eh ; 目标字符串起始位置第11行第32字符mov di,0 ; 目标字符串偏移量s: ; 循环遍历字符mov al,es:[si] ; 从源字符串读取字符mov ah,02h ; 第1行高8位设置属性绿色 mov [bx di 0 ], ax ; 写入字符 [起始位置 列偏移 行偏移]mov ah,24h ; 第2行高8位设置属性绿底红色mov [bx di 160],ax ; 写入字符 [起始位置 列偏移 行偏移]mov ah,71h ; 第3行高8位设置属性白底蓝色mov [bx di 320],ax ; 写入字符 [起始位置 列偏移 行偏移]inc si ; si 1 指向源字符串中下一字符add di,2 ; di 2 指向目标字符串下一字符loop s ; 循环mov ax,4c00h ; 退出程序int 21h
code ends
end start效果