assembly - 如何在Linux上从c源代码生成nasm可编译的汇编代码?

标签 assembly nasm gnu-assembler tasm yasm

测试平台为32位Linux。

基本上,我知道 gcc 可以用来生成 Intel 和 At&T 风格 汇编代码,但似乎不能直接使用nasm/tasm来编译 gcc 生成的 Intel 风格汇编代码。

我正在 Windows 和 Linux 平台上进行项目分析 asm 代码,所以我想如果它们都可以由像 nasm\yasm 这样的平台无关的汇编器编译,我可能会更轻松......

所以我的问题是如何在 Linux 上从 c 源代码生成 nasm 可编译的汇编代码?

最佳答案

我发现这是反汇编目标文件的更好方法,而不是使用 gcc 生成的汇编代码。

  1. 首先,从源代码生成目标文件:

    gcc -fno-asynchronous-unwind-tables -O2 -s -c -o main.o main.c
    

    -fno-asynchronous-unwind-tables:不要生成不必要的部分,例如.eh_frame

    -O2 进行了优化,因此汇编并不可怕。可以选择使用 -Os(大小超过速度)或 -O3(全面优化,包括自动矢量化)。您还可以通过 -march=native-march=haswell-march=znver1 调整 CPU 并使用它支持的扩展(禅宗)

    -s:制作更小的可执行文件( strip )

    -c -o main.o:编译但不链接,生成名为main.o的目标文件

  2. 使用objconv生成 nasm 代码:

    objconv -fnasm main.o
    

    结果将存储在main.asm中。

  3. 结果将非常接近 Nasm 语法。但是,您可能需要进行一些细微的调整以消除警告/错误。只需尝试使用 Nasm 编译即可

    nasm -f elf32 main.asm
    

    并手动修复错误/警告。例如:

    • .SECTION 行中删除 align=Nexecute/noexecute 字样。
    • global 声明中删除文本 : function
    • 删除default rel
    • 如果您愿意,可以删除空白部分等
  4. 链接 Nasm 在步骤 3 中使用 gcc 生成的 main.o:

    gcc main.o
    

    您也可以使用 ld 链接它,但这要困难得多。

关于assembly - 如何在Linux上从c源代码生成nasm可编译的汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20737947/

相关文章:

go - 将Go汇编程序翻译为NASM

linux - assembly 师返回非数字

assembly - 是否可以将 ymm16 - ymm31 用于 AVX2 vpcmpeq{size} 指令?

c++ - 检查 __m128i 是否为零?

assembly - NASM 程序集从 ASCII 转换为十进制

assembly - 为什么用 int 13h 读取扇区后 int 10h 不起作用?

linux - NASM Linux 32 位 : scanf, printf 调用

macos - OS-X 上的 GNU 链接器-GAS

assembly - 链接结构 LDR PEB

assembly - 汇编中标签和函数有什么区别