【发布时间】:2014-04-15 18:34:42
【问题描述】:
我需要开发一些算法,这些算法在 C 或 C++ 等高级语言中非常容易实现,但作为 NASM 指令直接编写变得非常困难。
由于基本上 C 和 C++ 编译器必须使用低级指令来生成二进制文件,有没有一种简单的方法可以从 C\C++ 程序中获取 NASM 代码。
【问题讨论】:
标签: c++ compiler-construction nasm
我需要开发一些算法,这些算法在 C 或 C++ 等高级语言中非常容易实现,但作为 NASM 指令直接编写变得非常困难。
由于基本上 C 和 C++ 编译器必须使用低级指令来生成二进制文件,有没有一种简单的方法可以从 C\C++ 程序中获取 NASM 代码。
【问题讨论】:
标签: c++ compiler-construction nasm
来自man gcc:
-S
在适当的编译阶段之后停止;不要组装。输出是每个非汇编程序的汇编程序代码文件的形式 指定的输入文件。
默认情况下,源文件的汇编文件名由 将后缀 .c、.i 等替换为 .s.
gcc -S hello.c 应该使用相应的汇编代码创建文件hello.s。
也适用于g++。
其他编译器可能有类似的选项。
例如,对于这个程序 (hello.c):
#include <stdio.h>
int main() {
printf("Hello, world! %d\n", 6*7);
return 0;
}
输出 (hello.s) 包含以下内容:
.file "hello.c"
.section .rodata
.LC0:
.string "Hello, world! %d\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $42, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.7.2-5) 4.7.2"
.section .note.GNU-stack,"",@progbits
【讨论】:
我发现编译(使用 -g 查看源代码和程序集)和在二进制文件上运行 objdump 更容易
objdump -M intel -d a.out
【讨论】:
intel和a.out和-M的参数是什么?