IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:x86

共 2 篇相关文章

IT 累计浏览 3,362

引导扇区实现

这篇讲的是如何从最底层实现一个操作系统启动的第一步:引导扇区。作者从BIOS加电自检后如何找到并执行启动代码讲起,解释了CPU进入实模式后的内存寻址机制,以及BIOS如何通过识别磁盘第一个扇区末尾的特定标志`0xaa55`来加载引导程序。 核心实现思路清晰:引导程序被加载到内存地址`0x7c00`处执行。文中给出了一段精简的汇编代码示例,演示了如何利用BIOS的`int 10h`中断,在屏幕上打印出“Hello,CB_OS!”字符串。这部分不仅展示了代码,还详细拆解了中断调用所需的参数设置,比如显示模式、字符长度和颜色属性。 巧妙之处在于,作者完整走通了从编写源码(`boot.asm`)、用`nasm`编译成二进制文件、再到通过`dd`命令写入磁盘镜像并使用bochs模拟器运行的整个流程。最终,在模拟器中成功看到输出,直观验证了引导扇区工作正常。文章从底层原理到可运行代码的完整路径,让操作系统启动这一抽象过程变得具体可感。

IT 累计浏览 2,302

CALL指令有多少种写法

这篇讲的是作者作为团队里的“救火队员”,接到一个实际需求:给定一个内存地址,判断它前面是否恰好是一条CALL指令——这常见于逆向工程或漏洞分析场景。由此出发,文章深入探讨了CALL指令在x86架构下令人眼花缭乱的编码形式。 文章系统地对比了多种写法。例如,最直接的近调用(E8)如何通过相对偏移定位目标函数;远调用(9A)在保护模式下如何切换代码段;以及通过寄存器(FF D0)或内存地址(FF 15)进行间接调用的不同情况。关键差异在于跳转目标的寻址方式(绝对地址 vs. 相对地址)和操作数长度,这直接决定了指令的灵活性、效率以及在二进制分析中的可识别性。 作者没有停留在罗列,而是结合逆向场景,点明了不同写法的应用特点。比如,直接调用(E8)结构清晰但目标固定,适合静态分析;间接调用(FF 15)则更灵活,常用于虚函数表或导入函数调用,是动态行为分析的重点。文章将这些枯燥的编码细节,与“如何识别一条CALL”这个实际问题紧密结合,帮助读者建立起清晰的概念框架。