2016-03-31 8 views
0

私は(私は私のコードが不完全なままです知っている - はい、私はそれをコンパイルする前にそれを完了するために計画しています)私のコードをテストしたい私はどのように行うのか、それは-sスイッチでコンパイルすることにより、正しいアセンブリコードを与えるかどうかを確認するためにこの?

私はコンパイルに精通していないです。私が今までにしたことは、私のファイルを保存することだけでした。今私はそれを実行できるようにそれをコンパイルする必要があります。-sスイッチでコンパイルしてCコードをテストしますか?

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

まず、コードを修正します。次に 'gcc -S'(' -s'ではなく)を使ってアセンブラを生成することができます。 –

+0

私はそれをコンパイルする前に完了する予定です。 – Jaden

+0

@ElliottFrischコンパイル時にファイル名を最初に含めますか?例: 'filename.c gcc -s' – Jaden

答えて

1
  1. オープン例
  2. タイプのエディタ、viやEmacsやファイルにコードを保存し、多分main.c
  3. 終了し、端末で編集
  4. タイプgcc -S main.cまたはclang -S main.c。また、アセンブリ出力を検査するための出力でより多くの情報を追加するためのコンパイラ、または-masm=intelフラグを伝えるために非常に良く-fverbose-asmフラグを追加することができます。成功した

  5. main.sという名前のファイルには、アセンブリ・コードを含む、現在のディレクトリの下に生成されます。エラーが発生すると、エラーメッセージが画面に表示されます。

はまた、それがコンパイルだとき、あなたの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 
+0

はい、これは私が探しているものです。だから、この1行だけでコンパイルできますか?私はしばらく前にファイルをコンパイルしたことを覚えています。いくつかのスイッチでコンパイルするには4つのステップが必要でした。 Like -oと-i – Jaden

+0

@Paulineアセンブリコードを生成するだけなので、 'gcc -S'や' clang -S'で十分です。 –

0

あなたが-Sスイッチを使用することができますGNUコンパイラコレクション(GCC)を使用して、リンクせずにコンパイルする:

[email protected]:~/src/so> gcc -S main.c 
main.c: In function ‘switch3’: 
main.c:11:12: error: expected ‘:’ before ‘;’ token 
    default; 
      ^

修正案で、あなたのコードを修正した後、あなたが得る:

[email protected]:~/src/so> gcc -S main.c 
[email protected]:~/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 
関連する問題