You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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; 
}

三、更优的转字节码方案

  1. 用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
  1. 用GDB临时汇编(适合调试场景)
    打开GDB后输入:
set disassembly-flavor intel
assemble mov %r8, %r10

直接就能看到对应的字节码。

  1. 用Keystone汇编引擎(适合集成到代码或命令行快速转换)
    Keystone是轻量汇编库,配套的命令行工具kstool可以直接转换:
kstool x86-64 mov %r8, %r10

内容的提问来源于stack exchange,提问作者ton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 23:15:32