【问题标题】:From C/C++ to NASM src从 C/C++ 到 NASM src
【发布时间】:2014-04-15 18:34:42
【问题描述】:

我需要开发一些算法,这些算法在 C 或 C++ 等高级语言中非常容易实现,但作为 NASM 指令直接编写变得非常困难。

由于基本上 C 和 C++ 编译器必须使用低级指令来生成二进制文件,有没有一种简单的方法可以从 C\C++ 程序中获取 NASM 代码。

【问题讨论】:

    标签: c++ compiler-construction nasm


    【解决方案1】:

    来自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
    

    【讨论】:

    • 我试过了,但是生成的代码真的很混乱,用小方法也很难理解。同样的方法直接用NASM写的肯定更小。有什么建议吗?
    • @AndreaF 是的,有很多噪音。但它是从编译器到汇编器的确切输出。很多只是为了正确的函数调用,参数处理,堆栈维护......如果你自己写,你可以更简单地做这些事情。但是核心功能是存在的,并且在稍微搜索后就可以看到(我建议在标签中查看函数名称)。
    • @AndreasF:这就是生成程序集输出的方式。它必须与 C 的其余部分兼容,并试图使事情变得高效。没有理由让它可读,所以它不会尝试。事实上,在大多数情况下,这可能会使程序运行不佳。
    【解决方案2】:

    我发现编译(使用 -g 查看源代码和程序集)和在二进制文件上运行 objdump 更容易

    objdump -M intel -d a.out
    

    【讨论】:

    • 感谢您的回答。你能给我更多关于使用这个命令行的细节吗? intela.out-M的参数是什么?
    • -M intel 告诉 objdump 以 Intel 语法显示程序集,这可以说比 (AT&T) 默认语法更好。a.out 只是您要反汇编的文件的名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2014-09-19
    相关资源
    最近更新 更多