汇编+qemu玩转控制台打印
有段时间开始对汇编感兴趣,也因此在写各种不同的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
: 累加器,用于大多数算术和数据传输操作。它是AL
和AH
的组合。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下的服务号(需要可以查手册)
0x02
- 设置光标位置- 将文本模式下的光标移动到指定位置。
DH
寄存器包含行号,DL
寄存器包含列号,BH
寄存器包含页号。
- 将文本模式下的光标移动到指定位置。
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寄存器的数字一改,就可以重复打印。
下期讲更加深入,这是第一次更汇编相关的内容,感谢关注~
汇编+qemu玩转控制台打印的更多相关文章
- 关于在Xcode控制台打印的注意点
注意!!在控制台中打印语句的返回值,这句代码也算是被执行过了一次 比如在下列代码的if语句执行之前,现在控制台打印 [_dataBaseexecuteUpdate:createSql] 的布尔值 if ...
- mybatis3.2.3+spring3 控制台打印sql解决办法
学习mybatis的时候遇到打印不出sql 的问题,在这里做个总结: 1:首先log4j.properties这样配置: log4j.rootLogger=DEBUG,console,R log4j. ...
- myeclipse 控制台打印空指针 ,黏贴控制台sql到plsql有结果集,异常处理
信用公司框架,不够熟悉. 在完成嗲点登录后,写动态页面是遇到,了问题:myeclipse 控制台打印空指针 ,黏贴控制台sql到plsql有结果集,异常处理. 最后大神给看,在接口实现重写的方法里返回 ...
- VS2010-win32下cocos2dx控制台打印的方法
在xcode中 直接使用printf 或者 cout<<""<<endl;可以直接在控制台打印 但是在VS2010 却死活不好用 真郁闷 ------ ...
- node 在控制台打印有色彩的输出
在学习 node 过程中,因为没有找到有断点的调试方法,只能退而次之,在控制台打印调试. 但整个控制台的输出都是一种颜色,有时候很难找到自己需要的信息,这时,有颜色的打印就会帮上很大的忙. conso ...
- Spring Boot使用AOP在控制台打印请求、响应信息
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等. AOP简介 AOP全称Aspect Oriented Programming,面向切面,AOP主要实现的 ...
- Javascript控制台打印Object对象
Javascript控制台打印Object对象 做项目的时候遇到一个问题,在调试代码时需要打印对象来查看具体数值,想了各种方法也没有实现,最后查资料知道了可以使用JSON.stringify()将ob ...
- vc++2010如何新建项目并在控制台打印helloworld
关于写c++使用什么集成开发环境的问题其实挺纠结的.我找了好久找到codeblocks,发现这款IDE还是最适合用在最标准的c++语法环境中.其实先前装过vs2015旗舰版,但是这款软件太大了,非常消 ...
- Intellij IDEA 2017 控制台打印换行
Intellij IDEA 2017 控制台打印的内容超过屏幕宽度了,请问怎么自动换行? 记得重启idea
- Spring Boot使用Log4j Implemented Over SLF4J生成日志并在控制台打印
Spring Boot设置切面,执行方法的时候在控制台打印出来,并生成日志文件 引入依赖: <!--日志--> <dependency> <groupId>org. ...
随机推荐
- mkfs.xfs报错 mkfs.xfs: /dev/new/new_box appears to contain an existing filesystem (ext4). mkfs.xfs: Use the -f option to force overwrite.
在设置逻辑卷文件类型时候报错 mkfs.xfs: /dev/new/new_box appears to contain an existing filesystem (ext4). mkfs.xfs ...
- 剑指Offer-52.正则表达式匹配(C++/Java)
题目: 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式. ...
- 对pta的总结_1
前言 这三次pta难度在不断上升的同时,要求我们线上慕课+自主学习来了解更多的java中的各种方法,如:正则表达式 List Map等.与此同时要求我们展开尝试并熟练类的构造,类的引用,链表的基本运用 ...
- 连续段 dp - 状态转移时依赖相邻元素的序列计数问题
引入 在一类序列计数问题中,状态转移的过程可能与相邻的已插入元素的具体信息相关. 这类问题通常的特点是,如果只考虑在序列的一侧插入,问题将容易解决. 枚举插入顺序的复杂度通常难以接受,转移时枚举插入位 ...
- RSA算法中,为什么需要的是两个素数?
PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全.密码学.联邦学习.同态加密等隐私计算领域的技术和内容. RSA算法中,为什么需要的是两个素数? RSA算法是一种广泛使用 ...
- 在线XML格式化工具
在线XML格式化工具可以帮助您轻松格式化混乱的XML代码.只需将您的XML代码复制并粘贴到文本框中,工具会自动对代码进行缩进.对齐和添加空格等操作,使代码看起来更加整洁和专业. 在线XML格式化工具
- 硬件开发笔记(十九):Altium Designer 21软件介绍和安装过程
前言 AD硬件设计软件之一,前面说了allego,但是allego对项目的管理.原理图生成PCB,PCB反向原理图等方面比较复杂,对于一般的硬件(非多个高速电路),选择AD能够加大的节省开发工作量 ...
- golang执行命令 && 实时获取输出结果
背景 golang可以获取命令执行的输出结果,但要执行完才能够获取. 如果执行的命令是ssh,我们要实时获取,并执行相应的操作呢? 示例 func main() { user := "roo ...
- 在KEIL中用JTAG仿真出错:error:cannot load driver".....JL2CM3.dll" 时的解决方法
在KEIL中用JTAG仿真出错:error:cannot load driver".....JL2CM3.dll" 时的解决方法 报错: Error:Cannot load dri ...
- 快速调用 GLM-4-9B-Chat 语言模型
一.确认本机显卡配置 二.下载大模型 国内可以从魔搭社区下载, 下载地址:https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat/files 三.运行官方 ...