《汇编语言》- 读书笔记 - 实验9 根据材料编程

《汇编语言》- 读书笔记 - 实验9 根据材料编程

  • 需求
  • 所需的相关知识
    • 属性字节每一位的含义
  • 分析
    • 字符位置
    • 属性
  • 解答
    • 思路
    • 代码
  • 效果

需求

在屏幕中间分别显示 绿色绿底红色白底蓝色 的字符串 welcome to masm!

所需的相关知识

80x25 彩色字符模式显示缓冲区(以下简称为显示缓冲区)的结构:

  1. 内存地址 B8000H ~ BFFFFH32KB,为 80x25 彩色字符模式的显示缓冲区。
    1.1. 向这段内存写数据,内容将立即出现在显示器上。
  2. 显示缓冲区共32KB,可分为 8页,每页内容占 4KB(≈4000B)。(这里的页是指显示屏)
    2.1. 默显示第 0B8000H ~ 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
1132字符坐标:B867E ~ B867F'

/*** 计算字符在 80x25 字符模式下的位置* rows 	第几行* column	第几个字符* start 显示缓冲区起始位置,默认 0xB8000*/
function getOffset( _rows, _column, start=0xB8000){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

属性

在这里插入图片描述

解答

思路

遍历字符串(数据段)复制到 目标内存中(显示缓冲区)。

  1. 先在数据段中定义字符串 welcome to masm!
  2. 遍历字符串,向目标写入数据。字符串长度16固定,用 立即数 写入 cx
  3. 居中显示,我从第11行32字符开始 B867E,初始偏移值 67E立即数 写入 bx 备用。
  4. 第一二三偏移量用立即数表示分别为:0160320
    第一行第一个字符:B867E + 0 字节
    第二行第一个字符:B867E + 160字节
    第三行第一个字符:B867E + 160字节 + 160字节
  5. 目标字符偏移量用 di 表示,初始为0,每轮循环结束前 +2。(显示每个字符占2字节)
  6. 先在 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

效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/686768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于DVWA靶场Could not connect to the database service的几种解决办法

总的来说这个问题都是 config 配置文件没有修改正确 一般修改数据库的用户名和密码与 phpstudy 一致并且添加了 key 就能初始化成功的 但是我还遇到过另一种情况,修改了上面的东西依旧无法连接到数据库 Could not connect to the database service. Please check …

如果马斯克投资OpenAI,而不是收购推特会如何?

从去年年底开始,AIGC就开始快速流行,生成式人工智能技术的不断演变,以OpenAI受到微软的追投开始,再以ChatGPT的发布快速在互联网市场蔓延为标志性事件,进而开始引领了一场新兴人工智能的快速发展之路。 去年&#xff…

Javaweb之SpringBootWeb案例之AOP通知类型的详细解析

3.1 通知类型 在入门程序当中,我们已经使用了一种功能最为强大的通知类型:Around环绕通知。 Around("execution(* com.itheima.service.*.*(..))") public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {//记录方法执行开始…

第13讲我创建的投票列表实现

新建我创建的投票页面 {"path": "pages/createVoteList/createVoteList","style": {"navigationBarTitleText": "我创建的投票"}}个人中心页面,加下 点击 “我创建的投票”跳转列表页面 goVoteList:function(){u…

阿里云服务器租用价格2024年新版活动报价和租用收费标准

2024年最新阿里云服务器租用费用优惠价格表,轻量2核2G3M带宽轻量服务器一年61元,折合5元1个月,新老用户同享99元一年服务器,2核4G5M服务器ECS优惠价199元一年,2核4G4M轻量服务器165元一年,2核4G服务器30元3…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_3

《剑指Offer》笔记&题解&思路&技巧&优化_Part_3 😍😍😍 相知🙌🙌🙌 相识😢😢😢 开始刷题1. LCR 138. 有效数字——表示数值的字符串2. LCR 139. 训练计划…

MATLAB导出图程序

本文将以代码的形式快速介绍MATLAB导出图到Paper 1 从simulation导出数 2 与simulation同源文件夹下创建导图m文件 代码如下: % 实验后的数据处理用 M-文件 % clear all % 清空工作空间 % close all      % 关闭所有图形窗口 % load adp.mat …

算法中关于数学的题目练习

算法中关于数学的题目练习 1、买不到的数目题目信息思路题解 2、蚂蚁感冒题目信息思路题解 3、饮料换购题目信息思路题解 1、买不到的数目 题目信息 思路 数学结论(证明略): p、q为正整数且互质,不能由p、q凑出来的最大的数为(p…

java生态环境评价Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 生态环境评价管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysq…

RK3399平台开发系列讲解(USB篇)USB控制传输方式介绍

🚀返回专栏总目录 文章目录 一、控制传输详解二、Setup阶段和Data阶段三、Setup 事务格式沉淀、分享、成长,让自己和他人都能有所收获!😄 📢USB控制传输是USB通信中的一种基本传输类型,用于控制USB设备的配置和操作。它由 Setup 阶段和 Data 阶段组成,可用于发送命令…

SIFT 2D/3D检测原理

一、SIFT 2D 二、SIFT 3D SIFT 3D关键点检测以及SAC-IA粗配准-CSDN博客

轻资产上班族副业,steam搬砖项目新手1周出结果

作为一个80后社畜,我打从上大学就喜欢倒腾各种赚钱的事情,不管操作网络上还是现实中的任何项目我都会亲自去摸索其中的赚钱原理,实践才能出真知。steam搬砖项目是我实操了3年多的项目,这个steam搬砖项目长期稳定又老牌阳光&#x…

深入理解lambda表达式

深入理解ASP.NET Core中的中间件和Lambda表达式 var builder WebApplication.CreateBuilder(args); var app builder.Build(); app.Use(async (context, next) > { // Add code before request. await next(context);// Add code after request.}); 这段C#代码是用于设…

模型 IPO(输入、处理、输出)学习模型

系列文章 分享 模型,了解更多👉 模型_总纲目录。重在提升认知。信息转化与传递。 1 模型 IPO(输入、处理、输出)学习模型的应用 1.1 项目管理知识体系 PMBOK 中的IPO应用 在项目管理领域,PMBOK(Project Management Body of Know…

防火墙 iptables(二)--------------------SNAT与DNAT

一、SNAT ①SNAT 应用环境: 局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由) ②SNAT原理: 源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映射 数据包从内网发送到公网时,SNAT会把数据包的源IP由…

下一代模型:Gemini 1.5,正如它的名字一样闪亮登场

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

QObject 的拷贝构造和赋值操作

QObject中没有提供一个拷贝构造函数和赋值操作符给外界使用,其实拷贝构造和赋值的操作都是已经声明了的,但是它们被使用了Q_DISABLE_COPY () 宏放在了private区域。因此所有继承自QObject的类都使用这个宏声明了他们的拷贝构造函数和赋值操作符为私有。 …

Java集合篇之深入解析LinkedList

写在开头 作为ArrayList的同门师兄弟,LinkedList的师门地位逊色不少,除了在做算法题的时候我们会用到它之外,在实际的开发工作中我们极少使用它,就连它的创造者都说:“I wrote it,and I never use it”&am…

[java基础揉碎]二维数组

目录 什么是二维数组: 二维数组在内存中的布局: 动态初始化: 静态初始化: 杨辉三角: 使用细节和注意事项: 什么是二维数组: 1.从定义形式上看 int[][] 2.可以这样理解,原来的一维数组的每个元素是一维数组,就构成二维数…

OpenCV识别人脸案例实战

使用级联函数 基本流程 函数介绍 在OpenCV中,人脸检测使用的是cv2.CascadeClassifier.detectMultiScale()函数,它可以检测出图片中所有的人脸。该函数由分类器对象调用,其语法格式为: objects cv2.CascadeClassifier.detectMul…