# x86-asm **Repository Path**: wjc133/x86-asm ## Basic Information - **Project Name**: x86-asm - **Description**: x86汇编学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-01-31 - **Last Updated**: 2025-01-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # x86 汇编练习 根据李忠老师《X86汇编——从实模式到保护模式》第一版进行练习,并适当加入了一些自己的理解。 ## 如何构建 本项目中所有目录下的代码都可以使用 build.sh 脚本进行构建。 本脚本位于项目根目录下,可以通过执行`export_build.sh`脚本将`build.sh`添加到 PATH,实现全局调用。本脚本用于自动化编译 x86 汇编文件 (.asm),并将其写入到指定扇区的软盘镜像 (boot.img) 中,以便在 Bochs 或 QEMU 中进行模拟运行。 ### 脚本功能概述 该脚本完成以下功能: 1. **参数检查**:确保用户输入了正确的 `.asm` 文件和目标扇区编号。 2. **创建软盘镜像**:使用 `bximage` 创建 1.44MB 软盘镜像 (`boot.img`)。 3. **编译汇编代码**:使用 `nasm` 编译输入的 `.asm` 文件为二进制格式。 4. **写入镜像**:将编译后的 `.bin` 文件写入 `boot.img` 的指定扇区。 5. **支持直接写入**:如果输入文件不是 `.asm` 文件,直接写入镜像而不编译。 6. **更新 Bochs 配置**:复制 `bochsrc` 文件到 `dist/` 目录。 7. **生成 QEMU 启动脚本**:自动创建 `run_qemu.sh` 以便快速启动 QEMU 进行测试。 ### 依赖环境 在运行此脚本之前,确保安装以下工具: - `nasm` (汇编编译器) - `bximage` (Bochs 提供的磁盘映像工具) - `qemu-system-i386` (QEMU 模拟器) - `Bochs` (可选,用于模拟执行) 如果尚未安装,可以使用以下命令安装: ```bash # Ubuntu/Debian sudo apt update sudo apt install nasm bochs bochs-x bximage qemu-system-x86 -y # Arch Linux sudo pacman -S nasm bochs qemu # macOS (需要 Homebrew) brew install nasm qemu bochs ``` ### 使用方法 ```bash ./script.sh [ ...] ``` 其中: - `` 是要编译的汇编文件路径 - `` 是该文件写入镜像的起始扇区(从 0 开始) - 可选地,可提供多个 `` 及其对应的 `` 例如: ```bash ./script.sh boot.asm 0 loader.asm 2 ``` 上述命令将: - 编译 `boot.asm` 并写入 `boot.img` 的 **第 0 扇区** - 编译 `loader.asm` 并写入 `boot.img` 的 **第 2 扇区** 如果输入的文件不是 `.asm`,则直接写入 `boot.img` 而不进行编译,例如: ```bash ./script.sh binary.bin 5 ``` 上述命令会将 `binary.bin` 直接写入 `boot.img` 的 **第 5 扇区**。 ### 运行 Bochs/QEMU #### Bochs 使用以下命令启动 Bochs: ```bash cd dist bochs -f bochsrc ``` #### QEMU 脚本会生成 `run_qemu.sh`,可直接运行: ```bash cd dist ./run_qemu.sh ``` 该脚本会启动 `qemu-system-i386` 并挂载 `boot.img` 作为软盘。 ## 如何调试 确保已经安装了 bochs,然后进入到对应的镜像文件所在目录。 ```bash bochs -f bochsrc_ ``` 即可运行 bochs 虚拟机进行调试。 常见调试指令: | 指令 | 示例 | 说明 | | ----------- | --------------- | ---------------------------------------------------------------- | | s | | step,单步执行,一次执行一条汇编指令 | | b | b 0x7c00 | break,在`0x0000:0x7c00`处打断点 | | c | | continue,继续执行,直到遇到断点 | | n | | 继续执行,直到跳出当前循环(`rep`) | | r | | reg,查看寄存器的值 | | sreg | | segment reg,查看段寄存器的值 | | creg | | control reg,查看控制寄存器的值 | | x | x/w 0xb800 | 查看内存,x/MemWidth Addr,例如:`x/4b 0x7c00`,`x/w 0xb800` | | u | u/10b 0x7c00 | 反编译,查看指定地址对应的汇编指令,不加地址则表示反编译当前地址 | | info b | | 查看断点,可以使用`d `删除断点 | | info gdt | | 查看GDT | | print-stack | print-stack 10b | 查看栈内数据 | 更多指令见:https://bochs.sourceforge.io/doc/docbook/user/internal-debugger.html