ToB企服应用市场:ToB评测及商务社交产业平台

标题: 汇编+qemu玩转控制台打印 [打印本页]

作者: 饭宝    时间: 2024-7-30 22:39
标题: 汇编+qemu玩转控制台打印
  有段时间开始对汇编感爱好,也因此在写各种差别的demo,如今分享之前学习的成果,必要下载的东西有nasm和qemu-system-i386,看看枯燥的汇编能产生多大的能量。
  先来复习一下通用寄存器:
8位通用寄存器:

16位通用寄存器:

  这些寄存器在稍后的demo当中会涉及到,因此先留意一下;除了寄存器,还要了解制止号和服务号。简单来说制止号就是标识制止处理程序的,服务号是用于在制止处理程序中内部选择服务的,上代码。
  1. ; MBR引导加载程序示例,打印一个带有颜色的字符 'H'
  2. ; NASM语法
  3. ; 编译:nasm hello.asm
  4. org 0x7C00  ; MBR起始位置
  5. ; 初始化BIOS数据区(可选)
  6. ; mov [0x0500], byte 0x00
  7. ; 设置打印位置到第一行第一列
  8. mov dh, 4     ; 行号 (BIOS中的行号从0开始)
  9. mov dl, 9     ; 列号
  10. mov bh, 0     ; 页号,通常设置为0
  11. mov ah, 0x02  ; 设置光标位置的服务号
  12. int 0x10
  13. ; 打印字符'H',设置颜色属性
  14. mov ah, 0x09  ; 打印字符串的服务号
  15. mov al, 'H'   ; 待打印的字符
  16. mov bl, 0x13  ; 颜色属性:前景白色(15),背景蓝色(1)
  17. mov bp, color_string  ; 字符串的内存偏移地址(一般都用bp寄存器存储字符串地址)
  18. mov cx, 1     ; 字符串长度
  19. int 0x10
  20. ; 填充剩余空间并添加MBR签名
  21. ; 确保MBR大小为512字节
  22. times 510 - ($ - $$) db 0
  23. dw 0xAA55  ; MBR签名
  24. ; 定义存储字符的内存位置
  25. color_string db 'H', 0
复制代码
  这期先将留意力重要放在一系列的mov指令当中,其它部分代码可以先直接跳过,int 0x10是用于访问和控制视频显示的制止,因此我们无论要设置光标还是打印字符都必要到用它。可以发现都是将一系列的参数放到差别的寄存器,然后再触发制止,这个制止内里值得留意的是AH这个寄存器,前面说到了它是AX寄存器的高8位,必要将服务号放置到这个AH寄存器内里,先来看看int 0x10下的服务号(必要可以查手册)
  3. 0x09 - 写字符串
     4.  0x0E - 打印字符
  目前想做的是将一种颜色的字符串打印到屏幕上面,因此先设置光标位置,确定位置之后再打印字符串,结合解释和这些寄存器规范就比力好明白了。完了再用汇编器nasm进行汇编。
  1. nasm hello.asm
复制代码
  接着放在qemu上面跑。
  1. qemu-system-i386 hello
复制代码
  结果不出意外长这样。

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

   把CX寄存器的数字一改,就可以重复打印。
 
  下期讲更加深入,这是第一次更汇编相关的内容,感谢关注~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4