将 llvm IR 转换为 NASM 程序集
Converting llvm IR to NASM assembly
我正在尝试将一大堆 llvm IR 代码转换为在 NASM 上运行的汇编代码。我不是很熟悉 assembly 或 llvm IR。我想知道是否有任何 transpiler/assembler/tools 可以帮助我做到这一点,或者是否有任何此类工具可用。
LLVM-IR 仍然需要编译。例如,使用 clang -c -O3 -march=native -ffast-math
执行此操作,然后使用 NASM-语法反汇编程序进行反汇编,例如 Agner Fog's objconv
which produces output that can be assembled. How to disassemble a binary executable in Linux to get the assembly code?.
不过,编译 -> 反汇编并不适合保留标签和符号名称。
如果你的意思是手动将 LLVM-IR 手写成 maintainable NASM,那么我认为移植的难易程度取决于是否使用了寄存器的数量由代码小于16; x86-64 只有 15 个通用整数寄存器,不包括堆栈指针。
如果 LLVM-IR 使用更多,您需要决定 "variables" 到 spill/reload to/from 堆栈(以及何时,如果您不留下一些永久在堆栈上的变量与其他永久在寄存器中的变量。
我正在尝试将一大堆 llvm IR 代码转换为在 NASM 上运行的汇编代码。我不是很熟悉 assembly 或 llvm IR。我想知道是否有任何 transpiler/assembler/tools 可以帮助我做到这一点,或者是否有任何此类工具可用。
LLVM-IR 仍然需要编译。例如,使用 clang -c -O3 -march=native -ffast-math
执行此操作,然后使用 NASM-语法反汇编程序进行反汇编,例如 Agner Fog's objconv
which produces output that can be assembled. How to disassemble a binary executable in Linux to get the assembly code?.
不过,编译 -> 反汇编并不适合保留标签和符号名称。
如果你的意思是手动将 LLVM-IR 手写成 maintainable NASM,那么我认为移植的难易程度取决于是否使用了寄存器的数量由代码小于16; x86-64 只有 15 个通用整数寄存器,不包括堆栈指针。
如果 LLVM-IR 使用更多,您需要决定 "variables" 到 spill/reload to/from 堆栈(以及何时,如果您不留下一些永久在堆栈上的变量与其他永久在寄存器中的变量。