Click here to Skip to main content
15,886,016 members
Articles / Programming Languages / ASM

Something You May Not Know About the Switch Statement in C/C++

Rate me:
Please Sign up or sign in to vote.
4.86/5 (152 votes)
19 Dec 2012CPOL13 min read 372.5K   463   146  
A discussion on how switch/case is executed, by reverse engineering in VC++
; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01 

	TITLE	D:\Articles\CodeProject\switch\CppExample\switch1.cpp
	.686P
	.XMM
	include listing.inc
	.model	flat

INCLUDELIB LIBCMTD
INCLUDELIB OLDNAMES

PUBLIC	_main
EXTRN	?f3@@YAXXZ:PROC					; f3
EXTRN	?f2@@YAXXZ:PROC					; f2
EXTRN	?f1@@YAXXZ:PROC					; f1
EXTRN	__RTC_CheckEsp:PROC
EXTRN	__RTC_Shutdown:PROC
EXTRN	__RTC_InitBase:PROC
;	COMDAT rtc$TMZ
; File d:\articles\codeproject\switch\cppexample\switch1.cpp
rtc$TMZ	SEGMENT
__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
rtc$TMZ	ENDS
;	COMDAT rtc$IMZ
rtc$IMZ	SEGMENT
__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
; Function compile flags: /Odtp /RTCsu /ZI
rtc$IMZ	ENDS
;	COMDAT _main
_TEXT	SEGMENT
tv64 = -208						; size = 4
_i$ = -8						; size = 4
_main	PROC						; COMDAT

; 4    : {

	push	ebp
	mov	ebp, esp
	sub	esp, 208				; 000000d0H
	push	ebx
	push	esi
	push	edi
	lea	edi, DWORD PTR [ebp-208]
	mov	ecx, 52					; 00000034H
	mov	eax, -858993460				; ccccccccH
	rep stosd

; 5    :     int i =3;    // or i =20

	mov	DWORD PTR _i$[ebp], 3

; 6    : 
; 7    :         switch (i)

	mov	eax, DWORD PTR _i$[ebp]
	mov	DWORD PTR tv64[ebp], eax
	mov	ecx, DWORD PTR tv64[ebp]
	sub	ecx, 1
	mov	DWORD PTR tv64[ebp], ecx
	cmp	DWORD PTR tv64[ebp], 17			; 00000011H
	ja	SHORT $LN1@main
	mov	edx, DWORD PTR tv64[ebp]
	movzx	eax, BYTE PTR $LN15@main[edx]
	jmp	DWORD PTR $LN16@main[eax*4]
$LN10@main:

; 8    :     {
; 9    :         case 1: f1(); break;

	call	?f1@@YAXXZ				; f1
	jmp	SHORT $LN11@main
$LN9@main:

; 10   :         case 2: f2(); break;

	call	?f2@@YAXXZ				; f2
	jmp	SHORT $LN11@main
$LN8@main:

; 11   :         case 5: f1(); break;

	call	?f1@@YAXXZ				; f1
	jmp	SHORT $LN11@main
$LN7@main:

; 12   :         case 7: f2(); break;

	call	?f2@@YAXXZ				; f2
	jmp	SHORT $LN11@main
$LN6@main:

; 13   :         case 10: f1(); break;

	call	?f1@@YAXXZ				; f1
	jmp	SHORT $LN11@main
$LN5@main:

; 14   :         case 11: f2(); break;

	call	?f2@@YAXXZ				; f2
	jmp	SHORT $LN11@main
$LN4@main:

; 15   :         case 12: f2(); break;

	call	?f2@@YAXXZ				; f2
	jmp	SHORT $LN11@main
$LN3@main:

; 16   :         case 17: f1(); break;

	call	?f1@@YAXXZ				; f1
	jmp	SHORT $LN11@main
$LN2@main:

; 17   :         case 18: f1(); break;

	call	?f1@@YAXXZ				; f1
	jmp	SHORT $LN11@main
$LN1@main:

; 18   : 
; 19   :         default: f3(); 

	call	?f3@@YAXXZ				; f3
$LN11@main:

; 20   :     }
; 21   : 
; 22   :     return 0;

	xor	eax, eax

; 23   : }

	pop	edi
	pop	esi
	pop	ebx
	add	esp, 208				; 000000d0H
	cmp	ebp, esp
	call	__RTC_CheckEsp
	mov	esp, ebp
	pop	ebp
	ret	0
$LN16@main:
	DD	$LN10@main
	DD	$LN9@main
	DD	$LN8@main
	DD	$LN7@main
	DD	$LN6@main
	DD	$LN5@main
	DD	$LN4@main
	DD	$LN3@main
	DD	$LN2@main
	DD	$LN1@main
$LN15@main:
	DB	0
	DB	1
	DB	9
	DB	9
	DB	2
	DB	9
	DB	3
	DB	9
	DB	9
	DB	4
	DB	5
	DB	6
	DB	9
	DB	9
	DB	9
	DB	9
	DB	7
	DB	8
_main	ENDP
_TEXT	ENDS
END

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions