C Code Comparison: if, do-while, while, and switch statements - Prof. Jian-Guo Liu, Study notes of Mathematics

An analysis of various control structures in c programming language, including if-then-else, do-while, while, and switch statements. It also discusses their assembly code equivalents and the use of jump tables for large switch statements.

Typology: Study notes

Pre 2010

Uploaded on 07/30/2009

koofers-user-9qp
koofers-user-9qp 🇺🇸

10 documents

1 / 9

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
Machine-Level Programming II:
Control Flow
Sept. 12, 2002
Machine-Level Programming II:
Control Flow
Sept. 12, 2002
Topics
Topics
nCondition Codes
lSetting
lTesting
nControl Flow
lIf-then-else
lVarieties of Loops
lSwitch Statements
class06.ppt
15-213
“The course that gives CMU its Zip!”
– 2 15-213, F’02
Condition Codes
Condition Codes
Single Bit Registers
Single Bit Registers
CF Carry Flag SF Sign Flag
ZF Zero Flag OF Overflow Flag
Implicitly Set By Arithmetic Operations
Implicitly Set By Arithmetic Operations
addl Src,Dest
C analog: t = a + b
nCF set if carry out from most significant bit
lUsed to detect unsigned overflow
nZF set if t == 0
nSF set if t < 0
nOF set if two’s complement overflow
(a>0 && b>0 && t<0) || (a<0 && b<0 && t>=0)
Not
Not Set by
Set by leal
leal
instruction
instruction
– 3 15-213, F’02
Setting Condition Codes (cont.)
Setting Condition Codes (cont.)
Explicit Setting by Compare Instruction
Explicit Setting by Compare Instruction
cmpl Src2,Src1
n cmpl b,a like computing a-b without setting destination
nCF set if carry out from most significant bit
lUsed for unsigned comparisons
nZF set if a == b
nSF set if (a-b) < 0
nOF set if two’s complement overflow
(a>0 && b<0 && (a-b)<0) || (a<0 && b>0 && (a-b)>0)
– 4 15-213, F’02
Setting Condition Codes (cont.)
Setting Condition Codes (cont.)
Explicit Setting by Test instruction
Explicit Setting by Test instruction
testl Src2,Src1
nSets condition codes based on value of Src1 & Src2
lUseful to have one of the operands be a mask
n testl b,a like computing a&b without setting destination
nZF set when a&b == 0
nSF set when a&b < 0
pf3
pf4
pf5
pf8
pf9

Partial preview of the text

Download C Code Comparison: if, do-while, while, and switch statements - Prof. Jian-Guo Liu and more Study notes Mathematics in PDF only on Docsity!

Machine-Level Programming II:

Control Flow

Sept. 12, 2002

Machine-Level Programming II:

Control Flow

Sept. 12, 2002

Topics Topics

n Condition Codes

l Setting l Testing

n Control Flow

l If-then-else l Varieties of Loops l Switch Statements class06.ppt

“The course that gives CMU its Zip!”

  • 2 – 15-213, F’

Condition Codes Condition Codes

Single Bit Registers Single Bit Registers

CF Carry Flag SF Sign Flag

ZF Zero Flag OF Overflow Flag

Implicitly Set By Arithmetic Operations Implicitly Set By Arithmetic Operations

addl Src , Dest

C analog: t = a + b

n CF set if carry out from most significant bit

l Used to detect unsigned overflow

n ZF set if t == 0

n SF set if t < 0

n OF set if two’s complement overflow

(a>0 && b>0 && t<0) || (a<0 && b<0 && t>=0)

Not Not Set bySet by lealleal instructioninstruction

Setting Condition Codes (cont.) Setting Condition Codes (cont.)

Explicit Setting by Compare InstructionExplicit Setting by Compare Instruction

cmpl Src2 , Src

n cmpl b,a like computing a-b without setting destination

n CF set if carry out from most significant bit

l Used for unsigned comparisons

n ZF set if a == b

n SF set if (a-b) < 0

n OF set if two’s complement overflow

(a>0 && b<0 && (a-b)<0) || (a<0 && b>0 && (a-b)>0)

Setting Condition Codes (cont.) Setting Condition Codes (cont.)

Explicit Setting by Test instruction Explicit Setting by Test instruction

testl Src2 , Src

n Sets condition codes based on value of Src1 & Src

l Useful to have one of the operands be a mask

n testl b,a like computing a&b without setting destination

n ZF set when a&b == 0

n SF set when a&b < 0

  • 5 – 15-213, F’

Reading Condition Codes Reading Condition Codes

SetX Condition Description

sete ZF Equal / Zero

setne ~ZF Not Equal / Not Zero

sets SF Negative

setns ~SF Nonnegative

setg ~(SF^OF)&~ZF Greater (Signed)

setge ~(SF^OF) Greater or Equal (Signed)

setl (SF^OF) Less (Signed)

setle (SF^OF)|ZF Less or Equal (Signed)

seta ~CF&~ZF Above (unsigned)

setb CF Below (unsigned)

SetXSetX InstructionsInstructions

n Set single byte based on combinations of condition codes

  • 6 – 15-213, F’

Reading Condition Codes (Cont.) Reading Condition Codes (Cont.)

SetX SetX InstructionsInstructions

n Set single byte based on

combinations of condition codes

n One of 8 addressable byte registers

l Embedded within first 4 integer registers l Does not alter remaining 3 bytes l Typically use movzbl to finish job

%eax

%edx

%ecx

%ebx

%esi

%edi

%esp

%ebp

%ah %al

%dh %dl

%ch %cl

%bh %bl

int gt (int x, int y) { return x > y; }

movl 12(%ebp),%eax # eax = y cmpl %eax,8(%ebp) # Compare x : y setg %al # al = x > y movzbl %al,%eax # Zero rest of %eax

Note inverted ordering!

Body

Jumping Jumping

jX Condition Description

jmp 1 Unconditional

je ZF Equal / Zero

jne ~ZF Not Equal / Not Zero

js SF Negative

jns ~SF Nonnegative

jg ~(SF^OF)&~ZF Greater (Signed)

jge ~(SF^OF) Greater or Equal (Signed)

jl (SF^OF) Less (Signed)

jle (SF^OF)|ZF Less or Equal (Signed)

ja ~CF&~ZF Above (unsigned)

jb CF Below (unsigned)

jXjX InstructionsInstructions

n Jump to different part of code depending on condition codes

Conditional Branch Example Conditional Branch Example

int max(int x, int y) { if (x > y) return x; else return y; }

_max: pushl %ebp movl %esp,%ebp

movl 8(%ebp),%edx movl 12(%ebp),%eax cmpl %eax,%edx jle L movl %edx,%eax L9:

movl %ebp,%esp popl %ebp ret

Body

Set Up

Finish

  • 13 – 15-213, F’

C Code

int fact_while (int x) { int result = 1; while (x > 1) { result *= x; x = x-1; }; return result; }

First Goto Version

int fact_while_goto (int x) { int result = 1; loop: if (!(x > 1)) goto done ; result *= x; x = x-1; goto loop ; done: return result; }

“While” Loop Example #1 “While” Loop Example

n Is this code equivalent to the do-while version?

n Must jump out of loop if test fails

  • 14 – 15-213, F’

C Code

int fact_while(int x) { int result = 1; while (x > 1) { result *= x; x = x-1; }; return result; }

Second Goto Version

int fact_while_goto (int x) { int result = 1; if (!(x > 1)) goto done ; loop: result *= x; x = x-1; if (x > 1) goto loop ; done: return result; }

Actual “While” Loop Translation Actual “While” Loop Translation

n Uses same inner loop

as do-while version

n Guards loop entry with

extra test

C Code

while ( Test ) Body

Do-While Version

if (! Test ) goto done ; do Body while( Test ); done :

General “While” Translation General “While” Translation

Goto Version

if (! Test ) goto done ; loop : Body if ( Test ) goto loop ; done :

“For” Loop Example “For” Loop Example

Algorithm Algorithm

n Exploit property that p = p 0 + 2 p 1 + 4 p 2 + … 2 n –1 pn –

n Gives: xp^ = z 0 · z 1 2 · ( z 2 2 ) 2 · … · (…(( zn –1^2 ) 2 )…) 2

zi = 1 when pi = 0 zi = x when pi = 1

n Complexity O(log p )

/* Compute x raised to nonnegative power p */ int ipwr_for(int x, unsigned p) { int result; for (result = 1; p != 0; p = p>>1) { if (p & 0x1) result = x; x = xx; } return result; }

n–1 times

Example

310 = 3^2 *** 3**^8

= 3^2 *** ((3**^2 ) 2 ) 2

  • 17 – 15-213, F’

ipwr ipwr ComputationComputation

/* Compute x raised to nonnegative power p */ int ipwr_for(int x, unsigned p) { int result; for (result = 1; p != 0; p = p>>1) { if (p & 0x1) result = x; x = xx; } return result; }

result x p 1 3 10 1 9 5 9 81 2 9 6561 1 531441 43046721 0

  • 18 – 15-213, F’

“For” Loop Example “For” Loop Example

for ( Init ; Test ; Update )

Body

int result; for (result = 1; p != 0; p = p>>1) { if (p & 0x1) result = x; x = xx; }

General Form

Init

result = 1

Test

p != 0

Update

p = p >> 1

Body

if (p & 0x1) result = x; x = xx; }

“For” “For” →→ “While”“While”

for ( Init ; Test ; Update )

Body

Init ; while ( Test ) { Body Update ; }

Goto Version

Init ; if (! Test ) goto done ; loop: Body Update ; if ( Test ) goto loop ; done:

For Version While Version

Do-While Version

Init ; if (! Test ) goto done ; do { Body Update ; } while ( Test ) done :

“For” Loop Compilation “For” Loop Compilation

Init

result = 1

Test

p != 0

Update

p = p >> 1

Body

if (p & 0x1) result = x; x = xx; }

Goto Version

Init ; if (! Test ) goto done ; loop : Body Update ; if ( Test ) goto loop ; done :

result = 1; if (p == 0) goto done ; loop : if (p & 0x1) result = x; x = xx; p = p >> 1; if (p != 0) goto loop ; done :

  • 25 – 15-213, F’

Jump Table Jump Table

Enumerated Values

ADD 0

MULT 1

MINUS 2

DIV 3

MOD 4

BAD 5

.section .rodata .align 4 .L57: .long .L51 #Op = 0 .long .L52 #Op = 1 .long .L53 #Op = 2 .long .L54 #Op = 3 .long .L55 #Op = 4 .long .L56 #Op = 5

Table Contents

.L51:

movl $43,%eax # ’+’ jmp .L .L52: movl $42,%eax # ’*’ jmp .L .L53: movl $45,%eax # ’-’ jmp .L .L54: movl $47,%eax # ’/’ jmp .L .L55: movl $37,%eax # ’%’ jmp .L .L56: movl $63,%eax # ’?’

Fall Through to .L

Targets & Completion

  • 26 – 15-213, F’

Switch Statement Completion Switch Statement Completion

PuzzlePuzzle

n What value returned when op is invalid?

AnswerAnswer

n Register %eax set to op at beginning of procedure

n This becomes the returned value

Advantage of Jump TableAdvantage of Jump Table

n Can do k -way branch in O ( 1 ) operations

.L49: # Done: movl %ebp,%esp # Finish popl %ebp # Finish ret # Finish

Object Code Object Code

Setup Setup

n Label .L49 becomes address 0x804875c

n Label .L57 becomes address 0x8048bc

08048718 : 8048718: 55 pushl %ebp 8048719: 89 e5 movl %esp,%ebp 804871b: 8b 45 08 movl 0x8(%ebp),%eax 804871e: 83 f8 05 cmpl $0x5,%eax 8048721: 77 39 ja 804875c 8048723: ff 24 85 c0 8b jmp *0x8048bc0(,%eax,4)

Object Code (cont.) Object Code (cont.)

Jump TableJump Table

n Doesn’t show up in disassembled code

n Can inspect using GDB

gdb code-examples

(gdb) x/6xw 0x8048bc

l E x amine 6 he x adecimal format “ w ords” (4-bytes each) l Use command “ help x ” to get format documentation

0x8048bc0 <_fini+32>:

0x

0x

0x

0x

0x

0x

  • 29 – 15-213, F’

Extracting Jump Table from Binary Extracting Jump Table from Binary

Jump Table Stored in Read Only Data Segment (. Jump Table Stored in Read Only Data Segment (.rodatarodata))

n Various fixed values needed by your code

Can examine with Can examine with objdumpobjdump

objdump code-examples –s –-section=.rodata

n Show everything in indicated segment.

Hard to read Hard to read

n Jump table entries shown with reversed byte ordering

n E.g., 30870408 really means 0x

Contents of section .rodata: 8048bc0 30870408 37870408 40870408 47870408 [email protected]... 8048bd0 50870408 57870408 46616374 28256429 P...W...Fact(%d) 8048be0 203d2025 6c640a00 43686172 203d2025 = %ld..Char = % …

  • 30 – 15-213, F’

Disassembled Targets Disassembled Targets

n movl %esi,%esi does nothing

n Inserted to align instructions for better cache performance

8048730: b8 2b 00 00 00 movl $0x2b,%eax 8048735: eb 25 jmp 804875c 8048737: b8 2a 00 00 00 movl $0x2a,%eax 804873c: eb 1e jmp 804875c 804873e: 89 f6 movl %esi,%esi 8048740: b8 2d 00 00 00 movl $0x2d,%eax 8048745: eb 15 jmp 804875c 8048747: b8 2f 00 00 00 movl $0x2f,%eax 804874c: eb 0e jmp 804875c 804874e: 89 f6 movl %esi,%esi 8048750: b8 25 00 00 00 movl $0x25,%eax 8048755: eb 05 jmp 804875c 8048757: b8 3f 00 00 00 movl $0x3f,%eax

Matching Disassembled Targets Matching Disassembled Targets

8048730: b8 2b 00 00 00 movl 8048735: eb 25 jmp 8048737: b8 2a 00 00 00 movl 804873c: eb 1e jmp 804873e: 89 f6 movl 8048740: b8 2d 00 00 00 movl 8048745: eb 15 jmp 8048747: b8 2f 00 00 00 movl 804874c: eb 0e jmp 804874e: 89 f6 movl 8048750: b8 25 00 00 00 movl 8048755: eb 05 jmp 8048757: b8 3f 00 00 00 movl

Entry

0x 0x 0x 0x 0x 0x

Sparse Switch Example Sparse Switch Example

n Not practical to use

jump table

l Would require 1000 entries

n Obvious translation into

if-then-else would have

max. of 9 tests

/* Return x/111 if x is multiple && <= 999. -1 otherwise */ int div111(int x) { switch(x) { case 0: return 0; case 111: return 1; case 222: return 2; case 333: return 3; case 444: return 4; case 555: return 5; case 666: return 6; case 777: return 7; case 888: return 8; case 999: return 9; default: return -1; } }