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

news2025/3/15 15:21:20

《汇编语言》- 读书笔记 - 实验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 segment
	db 'welcome to masm!'	; 源字符串
data ends

code segment
 start: mov ax,data		; 初始化数据段地址,读字符串
		mov es,ax
		mov 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.coloradmin.cn/o/1453296.html

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

相关文章

C语言-----函数功能实现---strcpystrlen

1.函数功能参数介绍 该函数的功能就是把一个字符串复制到另外的一个数组,包括\0; 2.首先我们要明确字符串的复制也是包括最后的\0的; void mystrcpy(char* dest, char* src) {while (*src!\0){*dest *src;dest;src;}*dest *src;} int mai…

VMwareWorkstation17.0虚拟机安装搭建Windows 11虚拟机(完整图文详细步骤教程)

VMwareWorkstation17.0虚拟机安装搭建Windows 11虚拟机(完整图文详细步骤教程) 一、下载Windows11二、配置Windows11虚拟机机器环境三、启动Windows11系统 一、下载Windows11 【点击打开最全面的Windows 11原版系统镜像下载地址】 https://blog.csdn.ne…

STM32——OLED菜单

文章目录 一.补充二. 二级菜单代码 简介:首先在我的51 I2C里面有OLED详细讲解,本期代码从51OLED基础上移植过来的,可以先看完那篇文章,在看这个,然后按键我是用的定时器扫描不会堵塞程序,可以翻开我的文章有单独的定时…

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-GPIO

目录 一、GPIO 概述二、GPIO模块相关API三、实例四、GPIO HDF驱动开发4.1、LED驱动程序(待续...)4.2、LED驱动配置(待续...) 坚持就有收获 轻量系统设备通常需要进行外设控制,例如温湿度数据的采集、灯开关的控制,因此在完成内核开发后,需要进…

【无标题】Matlab 之axes函数——创建笛卡尔坐标区

**基本用法:**axes 在当前图窗中创建默认的笛卡尔坐标区,并将其设置为当前坐标区。 应用场景1:在图窗中放置两个 Axes 对象,并为每个对象添加一个绘图。 要求1:指定第一个 Axes 对象的位置,使其左下角位于…

精工电联:定制精工线缆,赋能科技互联---致力于为客户提供卓越的连接线缆和连接器产品

精工电联 “定制精工线缆 ,赋能科技互联”,精工电联致力于为高科技产业提供全方位、多维度的集成线缆解决方案。凭借深厚的研发实力和丰富的行业经验,精工电联已经成功地在工控设备、医疗设备、人工智能、新能源领域、轨道交通和超声波设备等…

TCP三次握手、四次挥手(简易版)

TCP是面向连接的:在真正通讯之前,必须先建立一条通讯线路,必须先完成连接。 TCP完成连接的过程:(保证通讯线路畅通) 建立连接: 三次握手基本过程 ①客户端首先向服务器发送一个建立连接的…

中科星图——LANDSAT_8/02/T1/TOA的Landsat8_C2_TOA类数据集

简介 数据名称: Landsat8_C2_TOA 数据来源: USGS 时空范围: 2020年1月-2023年3月 空间范围: 全国 数据简介: Landsat8_C2_TOA数据集是将数据每个波段的辐射亮度值转换为大气层顶表观反射率TOA,是…

小苯的数组切分 ---- 牛客月赛

题目描述 qionghuaqionghuaqionghua 给了小苯一个长度为 n 的数组 a&#xff0c;希望小苯将数组 aaa 分为恰好非空的三段。即&#xff1a;[1,l−1],[l,r],[r1,n]这三段&#xff0c;其中 1< l≤r<n。接着&#xff1a; ∙ 第一段的所有数字做 ⊕&#xff08;按位异或&…

Acwing二分和前缀和(二)

机器人跳跃问题 原题链接&#xff1a;https://www.acwing.com/activity/content/problem/content/1570/ 二分查找更新条件只有两种&#xff1a; Rmid;else Lmid1&#xff1a;mid(LR)/2Lmid;else R mid-1&#xff1a;mid(LR1)/2 这两种更新条件的结果是一样的。 #include<…

STL:优先级队列的实现

STL中优先级队列本质上就是堆。在上一篇博客中讲到过&#xff1a;堆是一种完全二叉树&#xff0c;逻辑结构上看起来像树&#xff0c;但在物理结构中是存储在线性表中。与普通线性表不同的是&#xff0c;堆中数据大小是规律排列的&#xff1a;小堆中每个节点都大于它的父节点&am…

FPGA中的模块调用与例化

目录 一、模块调用与实例化 1.1 模块调用 1.2 模块实例化 1.3 Verilog例化语句及其用法 1.3.1 例化语句的基本格式 1.3.2 实例化三种不同的连接方法 二、模块调用实例-全加器与半加器 2.1 半加器模块 2.2 全加器模块 三、参数定义关键词与整数型寄存器 3.1 参数定义关…

《区块链公链数据分析简易速速上手小册》第10章:未来趋势和挑战(2024 最新版)

文章目录 10.1 区块链技术的发展方向10.1.1 基础知识10.1.2 重点案例&#xff1a;构建一个简单的智能合约步骤1: 创建智能合约步骤2: 部署智能合约步骤3: 使用Python与智能合约交互结语 10.1.3 拓展案例 1&#xff1a;探索 DeFi 应用准备工作实现步骤步骤1: 获取Compound市场数…

代码随想录算法训练营第二十天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

tips&#xff1a; 二叉搜索树一定是中序遍历&#xff0c;因为只有中序遍历二叉搜索树它的元素才是有序的。 回溯法则使用后序遍历方式&#xff0c;左右中&#xff0c;主要处理逻辑在中。采用后序是因为中的处理逻辑需要左分支和右分支递归带回来的处理结果&#xff0c;从而通过…

MySQL 基础知识(九)之视图

目录 1 视图的介绍 2 视图算法 3 创建视图 4 查看视图结构 5 修改视图 6 删除视图 7 参考文档 1 视图的介绍 视图是一张并不存储数据的虚拟表&#xff0c;其本质是根据 SQL 语句动态查询数据库中的数据。数据库中只存放了视图的定义&#xff0c;通过 SQL 语句使用视图时…

OpenHarmony系统解决方案 - 配置屏幕方向导致开机动画和Launcher显示异常

问题环境 系统版本&#xff1a;OpenHarmony-3.2-Release 问题现象 配置设备默认方向&#xff0c;例如修改为横屏显示&#xff0c;修改文件display_manager_config.xml的buildInDefaultOrientation参数值为2(Orientation::HORIZONTAL)。 源码中文件位于foundation/window/win…

[AIGC ~ coze] Kafka 消费者——从源码角度深入理解

Kafka 消费者——从源码角度深入理解 一、引言 Kafka 是一个分布式的流处理平台&#xff0c;广泛应用于大规模数据处理和实时数据管道。在 Kafka 生态系统中&#xff0c;消费者扮演着至关重要的角色&#xff0c;它们从 Kafka 主题中读取数据并进行处理。本文将深入探讨 Kafka …

Linux工具篇Vim

分享Linux的一些基础的工具&#xff0c;今天分享的就是Linux下的vim&#xff0c;vim其实是一个编辑器。我们可以理解为Windows下的一个记事本。 这个是vim的键盘图。 Linux编辑器-vim使用 vi/vim 的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是 vim 是…

【机器学习笔记】11 支持向量机

支 持 向 量 机 &#xff08; Support Vector Machine,SVM &#xff09; 支 持 向 量 机 是 一 类 按 监 督 学 习 &#xff08; supervisedlearning&#xff09;方式对数据进行二元分类的广义线性分类器&#xff08;generalized linear classifier&#xff09;&#xff0c;其…

Codeforces Round 919 (Div. 2)题解(A-E)

https://codeforces.com/contest/1920 A Satisfying Constraints 链接&#xff1a;A - Satisfying Constraints 代码 #include <bits/stdc.h> using namespace std; int main() {int T;cin >> T;while(T--){int n;scanf("%d", &n);vector<int&…