|

楼主 |
发表于 2014-6-8 22:07:53
|
显示全部楼层
本帖最后由 oggplay 于 2014-6-8 22:13 编辑
do-while,while语句学完然后是swtich语句:
- int switch_eg(int x , int n){
- int result=x;
-
- switch (n) {
-
- case 100:
- result*=13;
- break;
-
- case 102:
- result+=100;
- break;
-
- case 103:
- result+=11;
- break;
-
- case 104:
- case 106:
- result*=result;
- break;
-
- default:
- result=0;
- }
- return result;
- }
复制代码
将自己64位编译器汇编代码取代书本32位,逻辑都是一样的:
- .file "1.c"
- .text
- .globl switch_eg
- .align 16, 0x90
- .type switch_eg,@function
- switch_eg: # @switch_eg
- .cfi_startproc
- # BB#0:
- pushq %rbp
- .Ltmp2:
- .cfi_def_cfa_offset 16
- .Ltmp3:
- .cfi_offset %rbp, -16
- movq %rsp, %rbp
- .Ltmp4:
- .cfi_def_cfa_register %rbp
- movl %edi, -4(%rbp)
- movl %esi, -8(%rbp)
- movl -4(%rbp), %esi
- movl %esi, -12(%rbp)
- movl -8(%rbp), %esi
- addl $-100, %esi
- movl %esi, %eax
- subl $6, %esi
- movq %rax, -24(%rbp) # 8-byte Spill
- movl %esi, -28(%rbp) # 4-byte Spill
- ja .LBB0_5
- # BB#7:
- movq -24(%rbp), %rax # 8-byte Reload
- movq .LJTI0_0(,%rax,8), %rcx
- jmpq *%rcx
- .LBB0_1:
- imull $13, -12(%rbp), %eax
- movl %eax, -12(%rbp)
- jmp .LBB0_6
- .LBB0_2:
- movl -12(%rbp), %eax
- addl $100, %eax
- movl %eax, -12(%rbp)
- jmp .LBB0_6
- .LBB0_3:
- movl -12(%rbp), %eax
- addl $11, %eax
- movl %eax, -12(%rbp)
- jmp .LBB0_6
- .LBB0_4:
- movl -12(%rbp), %eax
- movl -12(%rbp), %ecx
- imull %eax, %ecx
- movl %ecx, -12(%rbp)
- jmp .LBB0_6
- .LBB0_5:
- movl $0, -12(%rbp)
- .LBB0_6:
- movl -12(%rbp), %eax
- popq %rbp
- ret
- .Ltmp5:
- .size switch_eg, .Ltmp5-switch_eg
- .cfi_endproc
- .section .rodata,"a",@progbits
- .align 8
- .LJTI0_0:
- .quad .LBB0_1
- .quad .LBB0_5
- .quad .LBB0_2
- .quad .LBB0_3
- .quad .LBB0_4
- .quad .LBB0_5
- .quad .LBB0_4
- .section ".note.GNU-stack","",@progbits
复制代码 |
|