GNU AS汇编指令转字节码输出冗余问题求助及替代方案问询
汇编指令转字节码问题解决
一、冗余内容是什么?
新版本GNU AS生成的.o目标文件是完整的ELF格式,里面除了汇编指令对应的机器码,还包含ELF头部、节表描述、节填充字节这些元数据。用ld --oformat binary转换时,会把整个ELF文件的所有内容一股脑转成二进制,自然就带上了这些无关的冗余信息。
二、怎么去除冗余?
最稳妥的办法是换用objcopy替代ld,它可以精准提取存放指令的.text代码段,完全避开那些元数据。修改你的函数如下:
show_bytecode(){ echo "$@" | as -o temp.o && objcopy -O binary -j .text temp.o temp.bin && xxd --ps temp.bin && rm temp.o temp.bin; }
关键参数解释:
-j .text:只处理.text节(就是你写的汇编指令编译后存放的地方)-O binary:指定输出纯二进制格式
现在再执行show_bytecode "mov %r8, %r10",就能得到正确的4d89c2了。
另外也可以用objdump直接提取字节码,不过这个依赖objdump的输出格式,适合临时使用:
show_bytecode(){ echo "$@" | as -o temp.o && objdump -d temp.o | awk '/^[0-9a-f]+ <.*>:/{getline; print $2$3$4$5$6$7$8$9}' && rm temp.o; }
三、更优的转字节码方案
- 用NASM直接生成二进制(注意语法差异:NASM是目标在前、源在后,和GAS相反)
show_bytecode_nasm(){ echo "$1" | nasm -f bin -o temp.bin - && xxd --ps temp.bin && rm temp.bin; } # 比如对应GAS的"mov %r8, %r10",NASM要写成"mov r10, r8" show_bytecode_nasm "mov r10, r8" # 输出4d89c2
- 用GDB临时汇编(适合调试场景)
打开GDB后输入:
set disassembly-flavor intel assemble mov %r8, %r10
直接就能看到对应的字节码。
- 用Keystone汇编引擎(适合集成到代码或命令行快速转换)
Keystone是轻量汇编库,配套的命令行工具kstool可以直接转换:
kstool x86-64 mov %r8, %r10
内容的提问来源于stack exchange,提问作者ton
相关产品推荐
相关产品推荐

