通过使用-s开关编译来测试C代码?

时间:2016-03-31 22:37:44

标签: c linux compilation

我想测试我的代码(我知道我的代码仍然不完整 - 是的,我计划在编译之前完成它),看看它是否通过-s开关编译提供了正确的汇编代码,我该怎么办这样做?

我对编译不是很熟悉。我到目前为止所做的就是保存我的档案。现在我需要编译它才能运行它。

typedef enum {MODE_A, MODE_B, MODE_C, MODE_D, MODE_E} mode_t;
long switch3 (long *p1, long *p2, mode_t action) {
    long result = 0;
    switch(action){
    case MODE_A:
    case MODE_B:
    case MODE_C:
    case MODE_D:
    case MODE_E:
    default:;    // don't forget the colon
    }
    return result;
}

2 个答案:

答案 0 :(得分:1)

  1. 打开编辑器,例如Vi或Emacs
  2. 输入并将代码保存在文件中,可能是main.c
  3. 退出编辑器
  4. 在终端中输入gcc -S main.cclang -S main.c。您还可以添加-fverbose-asm标志以告知编译器在输出中添加更多信息,或添加-masm=intel标志以更好地检查组件输出。

  5. 成功时,将在当前目录下生成名为main.s的文件,其中包含汇编代码;如果失败,将在屏幕上显示错误消息。

  6. 另请注意,只有在可编译时才会编译C代码,因此您必须先修改代码。至少,将default;更改为default:;

    以下是clang -S main.c在我的机器上生成的汇编代码:

        .section    __TEXT,__text,regular,pure_instructions
        .macosx_version_min 10, 11
        .globl  _switch3
        .align  4, 0x90
    _switch3:                               ## @switch3
        .cfi_startproc
    ## BB#0:
        pushq   %rbp
    Ltmp0:
        .cfi_def_cfa_offset 16
    Ltmp1:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
    Ltmp2:
        .cfi_def_cfa_register %rbp
        movq    %rdi, -8(%rbp)
        movq    %rsi, -16(%rbp)
        movl    %edx, -20(%rbp)
        movq    $0, -32(%rbp)
        movl    -20(%rbp), %edx
        subl    $4, %edx
        movl    %edx, -36(%rbp)         ## 4-byte Spill
        ja  LBB0_2
        jmp LBB0_1
    LBB0_1:
        jmp LBB0_2
    LBB0_2:
        jmp LBB0_3
    LBB0_3:
        movq    -32(%rbp), %rax
        popq    %rbp
        retq
        .cfi_endproc
    
    
    .subsections_via_symbols
    

答案 1 :(得分:0)

要使用GNU编译器集合(gcc)进行编译而不进行链接,您可以使用-S开关:

jan@jsn-dev:~/src/so> gcc -S main.c 
main.c: In function ‘switch3’:
main.c:11:12: error: expected ‘:’ before ‘;’ token
     default;
            ^

使用建议的修正更正代码后,您会得到:

jan@jsn-dev:~/src/so> gcc -S main.c 
jan@jsn-dev:~/src/so> cat main.s 
        .file   "main.c"
        .text
        .globl  switch3
        .type   switch3, @function
switch3:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movq    %rdi, -24(%rbp)
        movq    %rsi, -32(%rbp)
        movl    %edx, -36(%rbp)
        movq    $0, -8(%rbp)
        movq    -8(%rbp), %rax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   switch3, .-switch3
        .ident  "GCC: (SUSE Linux) 4.8.3 20140627 [gcc-4_8-branch revision 212064]"
        .section        .note.GNU-stack,"",@progbits