配置:
Ubuntu-24.04
ia16
# 添加 PPA 仓库
sudo add-apt-repository ppa:tkchia/build-ia16
sudo apt-get update# 安装预编译包
sudo apt-get install gcc-ia16-elf libi86-ia16-elf# 验证安装
ia16-elf-gcc -v
# 应该显示来自 PPA 的版本信息
使用方法
代码例子:
#include <stdio.h> int main() {printf("Hello world"); return 0;
}
# 编译你的程序
ia16-elf-gcc -march=i8086 -S -Os -masm=intel -li86 a.c -o test_intel.asm
结果
.arch i8086,jumps.code16.intel_syntax noprefix
#NO_APP.section .text.startup,"ax",@progbits.global main.type main, @function
main:mov ax, 37push axcall putcharadd sp, 2xor ax, axret.size main, .-main.ident "GCC: (GNU) 6.3.0"
解释:
命令各部分详解:
ia16-elf-gcc
- 这是交叉编译器的名称
ia16: 表示目标架构是 Intel 16位 (8086/8088)elf: 表示输出格式为 ELF (Executable and Linkable Format)
-march=i8086
- 指定目标处理器架构为原始的 8086
- 确保生成的代码只使用 8086 支持的指令集
- 不使用 80186/80286 等后续处理器的扩展指令
-S
- 告诉编译器只进行编译,不进行汇编和链接
- 输出结果是汇编源代码 (.asm 文件),而不是可执行文件
- 这是您想要生成汇编代码的关键选项
-Os
- 优化选项,表示优化代码大小 (Optimize for size)
- 编译器会尽量生成紧凑的代码,减少指令数量
- 在资源受限的 8086 环境中特别重要
-masm=intel
- 指定生成的汇编代码使用 Intel 语法
- 默认通常是 AT&T 语法,Intel 语法更常见于 DOS 环境
- Intel 语法格式:
指令 目标操作数, 源操作数
-li86
- 链接时包含 libi86 库
l是链接选项前缀,i86是库名- 提供 DOS 特定的函数,如 printf、conio 等
a.c
- 输入的 C 源代码文件
- 编译器将处理这个文件
-o test_intel.asm
- 指定输出文件名
-o: 输出选项test_intel.asm: 生成的汇编代码文件名
整个命令的功能流程:
- 预处理:处理
#include和宏定义 - 编译:将 C 代码转换为汇编代码
- 应用
-Os优化 - 使用
-march=i8086确保只生成 8086 兼容指令 - 使用
-masm=intel生成 Intel 语法的汇编
- 输出:将结果写入
test_intel.asm
- 不进行后续的汇编和链接步骤(因为使用了
-S)