lll*_*lll 21 assembly gnu-assembler nasm tasm yasm
测试平台是32位Linux.
基本上,我知道gcc可以用来生成Intel和At&T样式的汇编代码,但似乎你不能直接使用nasm/tasm来编译生成的Intel样式汇编代码.
我正在Windows和Linux平台上进行项目分析asm代码,所以我想如果它们都可以由像nasm\yasm这样的平台独立汇编程序编译,我可以有一个更容易的时间......
所以我的问题是如何从Linux上的c源代码生成一个nasm可编译的汇编代码?
Bab*_*yan 34
我发现这是一种更好的方法来反汇编目标文件,而不是使用gcc生成的汇编代码.
首先,从源代码生成目标文件:
gcc -fno-asynchronous-unwind-tables -O2 -s -c -o main.o main.c
Run Code Online (Sandbox Code Playgroud)
-fno-asynchronous-unwind-tables
:不要生成不必要的部分 .eh_frame
-O2
优化所以asm并不可怕.可选地使用-Os
(大小超速)或-O3
(包括自动向量化的完全优化).您也可以调整CPU并使用它支持的扩展 -march=native
或使用-march=haswell
或-march=znver1
(Zen)
-s
:make较小的可执行文件(strip)
-c -o main.o
:编译但不链接,生成一个名为的目标文件 main.o
使用objconv生成nasm
代码:
objconv -fnasm main.o
Run Code Online (Sandbox Code Playgroud)
结果将存储在main.asm
.
结果将非常接近Nasm语法.但是,您可能需要进行一些小的调整以消除警告/错误.只需尝试使用Nasm编译它
nasm -f elf32 main.asm
Run Code Online (Sandbox Code Playgroud)
并手动修复错误/警告.例如:
align=N
和execute
/ noexecute
words .SECTION
.: function
从global
声明中删除文本default rel
行main.o
使用gcc 链接在步骤3中由Nasm生成的结果:
gcc main.o
Run Code Online (Sandbox Code Playgroud)
你也可以使用ld链接它,但它更难.
如果你很懒:https: //github.com/diogovk/c2nasm
我有一个脚本自动执行Babken Vardanyan的建议.