Click here to Skip to main content
12,078,370 members (50,174 online)
Click here to Skip to main content

Stats

176.3K views
294 downloads
136 bookmarked
Posted

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

, 19 Dec 2012 CPOL
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)

Share

About the Author

Zuoliu Ding
Software Developer
United States United States
An Adjunct Faculty and Software Developer in Los Angeles and Orange County, CA

* Typical articles published in Dr. Dobb’s Journal and Windows Developer Magazine:

- A Silent Component Update for Internet Explorer
- Silent Application Update
- An MDI-Style Web Browser and Load Spy Monitor
- Implementing Wireless Print for WinNT/Win2K
- Multi-State Checkbox Tree Views
- A Generic Tool Tip Class
- An Easy Way to Add Tool Tips to Any MFC Control

- More from Google...

You may also be interested in...

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.160212.1 | Last Updated 19 Dec 2012
Article Copyright 2010 by Zuoliu Ding
Everything else Copyright © CodeProject, 1999-2016
Layout: fixed | fluid