首页 > 编程语言 >汇编+qemu玩转控制台打印

汇编+qemu玩转控制台打印

时间:2024-07-30 19:20:25浏览次数:10  
标签:字符 打印 mov 玩转 寄存器 字符串 控制台 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: 累加器,用于大多数算术和数据传输操作。它是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寄存器的数字一改,就可以重复打印。

 

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

标签:字符,打印,mov,玩转,寄存器,字符串,控制台,qemu,光标
From: https://www.cnblogs.com/ChebyshevTST/p/18328852

相关文章

  • 超详细Python教程——玩转PyCharm
    玩转PyCharmPyCharm是由JetBrains公司开发的提供给Python专业的开发者的一个集成开发环境,它最大的优点是能够大大提升Python开发者的工作效率,为开发者集成了很多用起来非常顺手的功能,包括代码调试、高亮语法、代码跳转、智能提示、自动补全、单元测试、版本控制等等。此外,P......
  • 简单的扫雷——基于C语言的控制台小游戏
    前言:  “将大象装进冰箱要几步?--打开冰箱,把大象放进去,关上冰箱。”  同样的,该扫雷游戏的编写过程也只需三步:逻辑梳理-代码实现-运行调试。本文将使用C语言来一步步剖析并完成扫雷这一案例。一.扫雷的游戏逻辑  该扫雷的游戏逻辑为:  1.生成棋盘,并布置数个......
  • 8G 显存玩转书生大模型 Demo-任务一
    使用LMDeploy完成InternLM2-Chat-1.8B模型的部署,并生成300字小故事,记录复现过程并截图。详细步骤1.编写python文件2.执行(下载模型并运行)3.已命令行交互式运行4.生成300字小故事......
  • 全网最简单git教程,仅四条指令玩转git
    前言作为改变程序员世界的软件,我不允许还有人不会用它,小到个人,大到大厂,几乎每个程序猿都脱离不了它。什么是git顾名思义就是仓库,帮你管理代码,并记录代码信息,什么意思呢?举个例子,比如我们买了一堆材料需要存在仓库里,方便取用,我们放进仓库是不是都需要记录哪一个架子上放了什......
  • 玩转大模型之三(FastGPT+OneAPI本地部署)
    一、服务器服务器:一台Linux16核32GIP:10.33.19.16基础环境:Docker、Docker-Compose二、FastGPT安装首先下载docker-compose.yml和config.json两个文件mkdirfastgptcdfastgptcurl-Ohttps://raw.githubusercontent.com/labring/FastGPT/main/projects/app/data/......
  • 用Python玩转Excel的五大功能!
    在数据分析和处理的过程中,Excel一直是备受欢迎的工具。然而,手动操作Excel既费时又容易出错。幸运的是,Python可以让你高效且智能地操作Excel文件,极大提升工作效率。那么,如何用Python玩转Excel呢?  Python可以为我们提供哪些强大的功能来处理Excel文件,使得我们的数据处理工作更......
  • 推荐一款将控制台程序部署到Windows服务的组件
    在日常开发中,有时候需要将我们的程序随着操作系统一起运行,并且无需人工干预。要实现这种效果,有很多种方法,比如:如果是桌面程序,可以设置到程序的启动项;如果是Web程序,还可以托管到IIS中,而对于控制台程序,最常见在做法是将程序部署成Windows服务,并设置成自动运行,这样当操作系统开机时,就......
  • 【Java常用设计模式】通俗易懂的玩转单例、建造者、工厂、策略模式(保姆篇)
    文章目录单例模式建造者模式工厂模式策略模式本篇小结更多相关内容可查看在一个狂风骤雨的下午,有人突然问了我一句,单例模式是什么,我愣了,相信看完这篇就不会愣了,本文以通俗易懂的方式写的,可能有不严谨的地方......
  • 将控制台程序发布为Windows服务
    部署在线文档管理系统出现的问题网上找了一个很好用的在线文档管理系统https://www.iminho.me/跟着文档部署时发现了一个小问题,就是这个服务程序运行之后会一直以控制台程序的形式运行在服务器中,如果后面有其他人登入系统,不小心关闭了这个程序,网站就无法正常访问了于是想着......
  • 我在 Windows 10 上运行 Python 代码后控制台立​​即关闭
    虽然我在代码末尾使用input(),但在Windows10(IDLE之外)的窗口中输入名称后,控制台仍然立即关闭,并且我看不到结果。我该怎么做才能阻止控制台关闭?#!python3name=input('Enteryourname:')print('Hello'+name)input('pressEntertoexit:')你在代码末尾......