咨询在binutils项目中添加x86指令mov2并重新编译需修改的文件
哈哈,我之前刚好折腾过类似的指令添加操作,给你梳理下关键步骤和需要修改的文件,应该能帮到你:
关键修改文件(binutils 源码内)
这些是x86指令相关的核心配置文件,你重点盯这几个:
- gas/config/tc-i386.c:这是GNU汇编器(gas)处理x86指令的核心逻辑文件。你需要找到处理
mov指令的条目(比如搜索"mov"定位到指令表项),直接复制一份改成"mov2",让它指向和mov完全相同的处理函数、操作数规则以及编码逻辑。 - opcodes/i386-opc.c:这个文件是x86指令集的opcode定义库,所有指令的编码映射、操作数匹配规则都在这里维护。找到
mov对应的opcode定义块,复制一份并将指令名替换为mov2,确保它复用mov的所有编码规则。 - opcodes/i386-dis.c:如果需要让反汇编器(objdump)也能识别
mov2(把对应机器码反汇编成mov2而不是mov),就得在这里添加mov2的反映射条目,对应到mov的机器码模式。 - gas/config/i386.h:部分版本的binutils会在这里定义指令相关的宏或枚举,检查下如果有
mov的相关定义,同步添加mov2的对应项。
编译验证步骤
修改完文件后,按以下步骤编译并验证:
- 进入binutils源码目录,创建单独的编译目录(推荐,避免污染源码):
mkdir build && cd build - 配置编译选项(根据你的目标架构调整
--target,--prefix指定安装路径):../configure --target=i686-pc-linux-gnu --prefix=/usr/local/binutils-mov2 - 并行编译:
make -j$(nproc) - 可选安装(方便全局调用修改后的工具):
sudo make install - 编写测试汇编文件
test.s验证:.global _start _start: mov2 %eax, %ebx mov2 $0x1, %eax int $0x80 - 用修改后的汇编器编译:
as test.s -o test.o - 反汇编查看结果:
正常情况下,反汇编输出里应该显示objdump -d test.omov2指令,且对应的机器码和mov完全一致。
小提示
- 有些新版本的binutils可能用自动生成的脚本管理指令定义(比如
opcodes/i386-gen.c),但大部分场景下手动修改上面几个文件就足够了。 - 如果编译报错,优先检查是不是漏了某个文件的定义,比如
tc-i386.c里的指令表是不是正确添加了mov2,确保它的操作数规则和mov完全匹配。
内容的提问来源于stack exchange,提问作者HRgiger
相关产品推荐
相关产品推荐

