《汇编语言》- 读书笔记 - 实验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 …

什么是NAT网关?联通云NAT网关有什么优势

在当今云计算时代,网络安全和连接性是企业发展的关键因素之一。NAT网关(Network Address Translation Gateway)是一种网络设备,它可以在私有网络和公共网络之间进行地址转换,从而使得内部网络中的设备能够与外部网络进…

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

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

DPDK系列之四十一数据收发整体流程源码分析之二流程框架

一、基本说明 本篇接着分析流程的源码,在收发数据前的基础准备。包括端口的初始化、配置等,当一切基础的准备完成后,工作状态也已经就绪,则可以开始工作了。端口的处理是启动程序前的一个开始环节。 在这个示例中,主要…

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…

ROS目标跟随(路径规划、slam、定位、雷达)——接上文,改善跟随的位置

确保进行跟随的小车始终在身后 最终效果代码改进 最终效果 ROS目标跟随改进版 代码改进 这里给出上一篇博客的链接:https://blog.csdn.net/m0_71523511/article/details/135610191 使用上一篇的launch文件创建机器人时,ros会自动创建一个坐标系相对关系…

阿里云服务器租用价格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…

12.18 校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流裙 ,内推/实习/校招汇总表格 1、实习&校招 | 寒序科技 2024实习/校招/合伙人招募启动 实习&校招 | 寒序科技 2024实习/校招/合伙人招募启动 2、校招 | 北京海纳川汽车部件2024届校园招聘火热进行中 校招 | 北…

突破编程_C++_面试(高级特性(2))

面试题8:什么是线程局部存储的技术 线程局部存储(Thread Local Storage,TLS)是一种存储变量的方法,这些变量在其所在的线程内是全局可访问的,但不能被其他线程访问,从而实现了变量的线程独立性…

深入理解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…