2016-03-31 2 views
0

Ich möchte meinen Code testen (ich weiß, dass mein Code noch unvollständig ist - ja, ich plane, ihn zu vervollständigen, bevor ich ihn kompiliere), um zu sehen, ob er den richtigen Assembler-Code durch Kompilieren mit -s gibt Dies?

Ich bin nicht sehr vertraut mit dem Kompilieren. Bisher habe ich nur meine Akte gespeichert. Jetzt muss ich es kompilieren, um es ausführen zu können.C-Code durch Kompilieren mit -s-Schalter testen?

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

Zuerst beheben Sie den Code. Dann können Sie 'gcc -S' (nicht' -s') verwenden, um Assembler zu erzeugen. –

+0

Ich plane, es zu vervollständigen, bevor ich es kompiliere. – Jaden

+0

@ElliottFrisch Schließe ich den Dateinamen am Anfang an, wenn ich ihn kompiliere? Beispiel: 'filename.c gcc -s' – Jaden

Antwort

1
  1. Öffnen Sie einen Editor, Vi oder Emacs zum Beispiel
  2. Typ und Ihren Code in einer Datei speichern, vielleicht main.c
  3. Beenden Sie den Editor
  4. Typ gcc -S main.c oder clang -S main.c im Terminal. Sie können auch ein -fverbose-asm Flag hinzufügen, um dem Compiler zu sagen, dass er mehr Informationen in der Ausgabe hinzufügen soll, oder ein -masm=intel Flag, um die Assemblyausgabe viel besser zu überprüfen.

  5. Bei Erfolg wird eine Datei mit dem Namen main.s unter dem aktuellen Verzeichnis mit dem Assemblycode generiert. Bei einem Fehler werden Fehlermeldungen auf dem Bildschirm ausgegeben.

Beachten Sie auch, dass Ihr C-Code wird nur dann kompiliert werden, wenn es übersetzbar, so dass Sie Ihren Code zuerst ändern. Zumindest hier default:;

default; ändern, ist der von clang -S main.c auf meiner Maschine erzeugte Assembler-Code:

.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

Ja, das ist, was ich suche. Also reicht diese eine Zeile aus, um es zu kompilieren? Ich erinnere mich, dass ich vor einiger Zeit eine Datei kompiliert habe und ich brauchte 4 Schritte, um es mit mehreren Switches zu kompilieren. Wie -o und -i – Jaden

+0

@Pauline Da Sie nur den Assembler-Code generieren, ist 'gcc -S' oder' clang -S' genug. –

0

zu kompilieren, ohne GNU Compiler Collection mit Verknüpfung (gcc) können Sie die -S Schalter verwenden:

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

Nachdem Sie den Code mit dem vorgeschlagenen fix zu korrigieren, erhalten Sie:

[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