汇编+qemu玩转控制台打印

汇编+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

  结果不出意外长这样。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛马程序员24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值