我想测试我的代码(我知道我的代码仍然不完整 - 是的,我计划在编译之前完成它),看看它是否通过-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;
}
答案 0 :(得分:1)
main.c
在终端中输入gcc -S main.c
或clang -S main.c
。您还可以添加-fverbose-asm
标志以告知编译器在输出中添加更多信息,或添加-masm=intel
标志以更好地检查组件输出。
成功时,将在当前目录下生成名为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
答案 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