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 : }
, 。
switch
int test()
{
int i,j;
i=j=0;
switch(i)
{
case 1:j+=1;break;
case 2:j+=2;break;
case 3:j+=3;break;
case 4:j+=4;break;
default:j+=10;
}
return 0;
}
:
; 5 :
; 6 : switch(i)
mov ecx, DWORD PTR _i$[ebp]
mov DWORD PTR tv64[ebp], ecx
mov edx, DWORD PTR tv64[ebp]
sub edx, 1
mov DWORD PTR tv64[ebp], edx
cmp DWORD PTR tv64[ebp], 3
ja SHORT $LN1@test
mov eax, DWORD PTR tv64[ebp]
jmp DWORD PTR $LN10@test[eax*4]
; :
if(i-1 > 3)
{
goto $LN1@test;// default
}
else
{
goto $LN10@test[i-1];//case 1,case 2,case 3,case 4
}
$LN10@test , , , case , 。
$LN5@test:
; 7 : {
; 8 : case 1:j+=1;break;
mov ecx, DWORD PTR _j$[ebp]
add ecx, 1
mov DWORD PTR _j$[ebp], ecx
jmp SHORT $LN6@test
$LN4@test:
; 9 : case 2:j+=2;break;
mov edx, DWORD PTR _j$[ebp]
add edx, 2
mov DWORD PTR _j$[ebp], edx
jmp SHORT $LN6@test
$LN3@test:
; 10 : case 3:j+=3;break;
mov eax, DWORD PTR _j$[ebp]
add eax, 3
mov DWORD PTR _j$[ebp], eax
jmp SHORT $LN6@test
$LN2@test:
; 11 : case 4:j+=4;break;
mov ecx, DWORD PTR _j$[ebp]
add ecx, 4
mov DWORD PTR _j$[ebp], ecx
jmp SHORT $LN6@test
$LN1@test:
; 12 : default:j+=10;
mov edx, DWORD PTR _j$[ebp]
add edx, 10 ; 0000000aH
mov DWORD PTR _j$[ebp], edx
$LN6@test:
; 13 : }
......
$LN10@test:
DD $LN5@test ;case 1
DD $LN4@test ;case 2
DD $LN3@test ;case 3
DD $LN2@test ;case 4
case :
int test()
{
int i,j;
i=j=0;
switch(i)
{
case 1:j+=1;break;
case 2:j+=2;break;
case 9:j+=3;break;
case 15:j+=4;break;
default:j+=10;
}
return 0;
}
:
_test PROC
; 2 : {
.....
; 5 :
; 6 : switch(i)
mov ecx, DWORD PTR _i$[ebp]
mov DWORD PTR tv64[ebp], ecx
mov edx, DWORD PTR tv64[ebp]
sub edx, 1
mov DWORD PTR tv64[ebp], edx
cmp DWORD PTR tv64[ebp], 14 ; 0000000eH
ja SHORT $LN1@test
mov eax, DWORD PTR tv64[ebp]
movzx ecx, BYTE PTR $LN10@test[eax]
jmp DWORD PTR $LN11@test[ecx*4]
:
if(i-1>=14)
{
goto $LN1@test ;// switch defaul
}
else
{
index = $LN10@test[i-1];//$LN10@test
goto $LN11@test[index];//$LN11@teest
}
, case , case , 。
$LN5@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 $LN6@test
$LN4@test:
; 9 : case 2:j+=2;break;
mov eax, DWORD PTR _j$[ebp]
add eax, 2
mov DWORD PTR _j$[ebp], eax
jmp SHORT $LN6@test
$LN3@test:
; 10 : case 9:j+=3;break;
mov ecx, DWORD PTR _j$[ebp]
add ecx, 3
mov DWORD PTR _j$[ebp], ecx
jmp SHORT $LN6@test
$LN2@test:
; 11 : case 15:j+=4;break;
mov edx, DWORD PTR _j$[ebp]
add edx, 4
mov DWORD PTR _j$[ebp], edx
jmp SHORT $LN6@test
$LN1@test:
; 12 : default:j+=10;
mov eax, DWORD PTR _j$[ebp]
add eax, 10 ; 0000000aH
mov DWORD PTR _j$[ebp], eax
$LN6@test:
; 13 : }
; 14 :
; 15 : return 0;
xor eax, eax
; 16 : }
mov esp, ebp
pop ebp
ret 0
$LN11@test:
DD $LN5@test
DD $LN4@test
DD $LN3@test
DD $LN2@test
DD $LN1@test
$LN10@test:
DB 0
DB 1
DB 4
DB 4
DB 4
DB 4
DB 4
DB 4
DB 2
DB 4
DB 4
DB 4
DB 4
DB 4
DB 3
_test ENDP
case :
int test()
{
int i,j;
i=j=0;
switch(i)
{
case 1:j+=1;break;
case 100:j+=2;break;
case 250:j+=3;break;
case 550:j+=4;break;
default:j+=10;
}
return 0;
}
:
; 5 :
; 6 : switch(i)
mov ecx, DWORD PTR _i$[ebp]
mov DWORD PTR tv64[ebp], ecx
; 250 $LN10@test, case 550
cmp DWORD PTR tv64[ebp], 250 ; 000000faH
jg SHORT $LN10@test
case 250
cmp DWORD PTR tv64[ebp], 250 ; 000000faH
je SHORT $LN3@test
;case 1
cmp DWORD PTR tv64[ebp], 1
je SHORT $LN5@test
;case 100
cmp DWORD PTR tv64[ebp], 100 ; 00000064H
je SHORT $LN4@test
; default
jmp SHORT $LN1@test
$LN10@test:
;case 550
cmp DWORD PTR tv64[ebp], 550 ; 00000226H
je SHORT $LN2@test
; default
jmp SHORT $LN1@test
$LN5@test:
, ! , 。 , 。 , , , , , 。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.