首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

汇编+qemu玩转控制台打印

编程知识
2024年07月30日 18:06

  有段时间开始对汇编感兴趣,也因此在写各种不同的demo,现在分享之前学习的成果,需要下载的东西有nasm和qemu-system-i386,看看枯燥的汇编能产生多大的能量。

  先来复习一下通用寄存器:

8位通用寄存器:

  • AL: 用于存储操作数低8位的数据寄存器。
  • AH: 用于存储操作数高8位的数据寄存器(通常与AL结合使用,形成16位的AX寄存器)。
  • BL: 另一个用于存储数据的寄存器,常用于BIOS中断调用中设置颜色或作为其他参数。
  • BH: 与BL配合使用,形成16位的BX寄存器。
  • CL: 常用于计数器,例如在循环或位移操作中。
  • CH: 与CL配合使用,形成16位的CX寄存器。
  • DL: 用于存储数据,也可用于指定I/O端口映射。
  • DH: 与DL配合使用,形成16位的DX寄存器。

16位通用寄存器:

  • AX: 累加器,用于大多数算术和数据传输操作。它是ALAH的组合。
  • BX: 基址寄存器,常用于存储内存地址或作为循环计数器。
  • CX: 计数寄存器,常用于循环计数和字符串操作。
  • DX: 数据寄存器,常用于I/O操作和某些算术操作。

  这些寄存器在稍后的demo当中会涉及到,因此先留意一下;除了寄存器,还要了解中断号和服务号。简单来说中断号就是标识中断处理程序的,服务号是用于在中断处理程序中内部选择服务的,上代码。

; MBR引导加载程序示例,打印一个带有颜色的字符 'H'
; NASM语法
; 编译:nasm hello.asm

org 0x7C00  ; MBR起始位置

; 初始化BIOS数据区(可选)
; mov [0x0500], byte 0x00

; 设置打印位置到第一行第一列
mov dh, 4     ; 行号 (BIOS中的行号从0开始)
mov dl, 9     ; 列号
mov bh, 0     ; 页号,通常设置为0
mov ah, 0x02  ; 设置光标位置的服务号
int 0x10

; 打印字符'H',设置颜色属性
mov ah, 0x09  ; 打印字符串的服务号
mov al, 'H'   ; 待打印的字符
mov bl, 0x13  ; 颜色属性:前景白色(15),背景蓝色(1)
mov bp, color_string  ; 字符串的内存偏移地址(一般都用bp寄存器存储字符串地址)
mov cx, 1     ; 字符串长度
int 0x10

; 填充剩余空间并添加MBR签名
; 确保MBR大小为512字节
times 510 - ($ - $$) db 0
dw 0xAA55  ; MBR签名

; 定义存储字符的内存位置
color_string db 'H', 0

  这期先将注意力主要放在一系列的mov指令当中,其它部分代码可以先直接跳过,int 0x10是用于访问和控制视频显示的中断,因此我们无论要设置光标还是打印字符都需要到用它。可以发现都是将一系列的参数放到不同的寄存器,然后再触发中断,这个中断里面值得注意的是AH这个寄存器,前面说到了它是AX寄存器的高8位,需要将服务号放置到这个AH寄存器里面,先来看看int 0x10下的服务号(需要可以查手册)

  1. 0x02 - 设置光标位置

    • 将文本模式下的光标移动到指定位置。DH 寄存器包含行号,DL 寄存器包含列号,BH 寄存器包含页号。
  2. 0x03 - 获取光标位置

    • 读取当前光标的位置。调用后,DH 寄存器包含行号,DL 寄存器包含列号,BH 寄存器包含页号。

  3. 0x09 - 写字符串

    • 在当前光标位置打印一个字符串。AL 寄存器包含要打印的字符,BL 寄存器包含颜色属性,CX 寄存器包含重复次数。

     4.  0x0E - 打印字符

    • 在当前光标位置打印一个字符。AL 寄存器包含要打印的字符,BL 寄存器包含颜色属性。

  目前想做的是将一种颜色的字符串打印到屏幕上面,因此先设置光标位置,确定位置之后再打印字符串,结合注释和这些寄存器规范就比较好理解了。完了再用汇编器nasm进行汇编。

nasm hello.asm

  接着放在qemu上面跑。

qemu-system-i386 hello

  结果不出意外长这样。

  需要注意一点,比如说设置光标的那个服务号不要忘记推到AH寄存器,不然会出现奇怪的错误,比如每次打印的字符串不同。简言之就是在触发中断之前一定要记得设置好服务号;另外定义字符串最后也别忘记了加上一个0,这点和C语言字符串类似。

   把CX寄存器的数字一改,就可以重复打印。

 

  下期讲更加深入,这是第一次更汇编相关的内容,感谢关注~

From:https://www.cnblogs.com/ChebyshevTST/p/18328852
本文地址: http://www.shuzixingkong.net/article/606
0评论
提交 加载更多评论
其他文章 火山引擎VeDI数据技术分享:两个步骤,为Parquet降本提效
本文将介绍字节跳动基于Parquet格式降本增效的技术原理和在具体业务中的实践,首先介绍了Parquet格式在字节跳动的应用,然后将结合具体的应用场景:小文件合并和列级TTL ,从问题产生的背景和解决问题的技术方案出发,介绍如何基于Parquet格式实现降本增效的目标。
火山引擎VeDI数据技术分享:两个步骤,为Parquet降本提效 火山引擎VeDI数据技术分享:两个步骤,为Parquet降本提效 火山引擎VeDI数据技术分享:两个步骤,为Parquet降本提效
《花100块做个摸鱼小网站 · 序》灵感来源
序 大家好呀,我是summo,这次来写写我在上班空闲(摸鱼)的时候做的一个小网站的事。去年阿里云不是推出了个活动嘛,2核2G的云服务器一年只要99块钱,懂行的人应该知道这个价格在业界已经是非常良心了,虽然优惠只有一年,但是买一台用来学习还是非常合适的(优惠链接在这,需要自取)。 我也跟风买了一台,开
《花100块做个摸鱼小网站 · 序》灵感来源 《花100块做个摸鱼小网站 · 序》灵感来源 《花100块做个摸鱼小网站 · 序》灵感来源
前后端数据的交互--如何实现数据加密?--02
数据加密是保护数据安全的重要手段,通过加密技术,我们可以确保即使数据被窃取,也无法直接读取其中的信息。本文将介绍三种常见的加密方法:对称加密、非对称加密以及数据库加密,并展示如何在实际项目中实现这些加密技术。 1. 对称加密 对称加密算法使用相同的密钥进行加密和解密。AES(Advanced Enc
一个基于 SourceGenerator 生成 从 dbReader转换为 class 数据的性能测试实验
好奇 SourceGenerator 出现开始,好几年了,虽然一直好奇用SourceGenerator 生成代码 与 emit 等动态生成的代码会有多少差距, 但是一直特别懒,不想搞 其实 dapper aot 项目做了类似事情,不过功能特别积极,还引用了实验特性,所以还是想更为简单客观对比 本次乘
3.哈希表
哈希表 1.引入 哈希表又称散列表,一种以「key-value」形式存储数据的数据结构。 所谓以「key-value」形式存储数据,是指任意的键值 key 都唯一对应到内存中的某个位置。只需要输入查找的键值,就可以快速地找到其对应的 value。 可以把哈希表理解为一种高级的数组,这种数组的下标可以
3.哈希表 3.哈希表
Spring AOP概念及原理
Spring AOP(面向切面编程) 以下内容由ChatGPT生成 AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过分离关注点来提高程序的模块化。Spring AOP 主要用于横切关注点(如日志记录、安全、事务管理等)的实现。在 Spring 中
ClickHouse的向量处理能力
ClickHouse通过其强大的向量数据库功能,实现了高效的高维向量数据处理和搜索。这些功能包括支持余弦距离和欧几里得距离的相似度计算,以及近似最近邻搜索(如Annoy索引),极大地提升了性能和效率。通过将非结构化数据转换为向量,ClickHouse在推荐系统、问答系统、图像和视频搜索等领域展现了显
AI/机器学习(计算机视觉/NLP)方向面试复习1
1. 判断满二叉树 所有节点的度要么为0,要么为2,且所有的叶子节点都在最后一层。 #include <iostream> using namespace std; class TreeNode { public: int val; TreeNode* left; TreeNo
AI/机器学习(计算机视觉/NLP)方向面试复习1 AI/机器学习(计算机视觉/NLP)方向面试复习1