C语言switch语句的汇编语言实现
一个好的编译器一定是一群顶尖软件高手们集体长时间创作的作品了,所以研究研究编译器的编译过程就是在向这些高手们学习。说到底,编译器也是一个很好的老师了,它可以为我们揭开高级语言实现的奥秘,为那些永不满足于表面现象的程序员深入掌握一门语言提供一个很好的途径。 来看看微软的cl 8.0编译器是怎样来编译C语言的switch语句的,照例写一个测试的例子:
int test()
{
int i,j;
i=j=0;
switch(i)
{
case 1:j+=1;break;
case 2:j+=2;break;
default:j+=5;
}
return 0;
}
看看生成的汇编代码:
; 5 :
; 6 : switch(i)
mov ecx, DWORD PTR _i$[ebp]
mov DWORD PTR tv64[ebp], ecx
;case 1:
cmp DWORD PTR tv64[ebp], 1
je SHORT $LN3@test
;case 2:
cmp DWORD PTR tv64[ebp], 2
je SHORT $LN2@test
;default:
jmp SHORT $LN1@test
$LN3@test:
; 7 : {
; 8 : case 1:j+=1;break;
mov edx, DWORD PTR _j$[ebp]
add edx, 1
mov DWORD PTR _j$[ebp], edx
jmp SHORT $LN4@test
$LN2@test:
; 9 : case 2:j+=2;break;
mov eax, DWORD PTR _j$[ebp]
add eax, 2
mov DWORD PTR _j$[ebp], eax
jmp SHORT $LN4@test
$LN1@test:
; 10 : default:j+=5;
mov ecx, DWORD PTR _j$[ebp]
add ecx, 5
mov DWORD PTR _j$[ebp], ecx
$LN4@test:
; 11 : }
; 12 :
; 13 : return 0;
xor eax, eax
; 14 : }
这段汇编代码是很好理解的,就是比较并跳转的过程。