15 213 The course that gives CMU its Zip Machine Level Programming II Control Flow Sept 09 2008 Topics Condition Codes Setting Testing Control Flow If then else Varieties of Loops Switch Statements class05 ppt x86 64 features conditional move different loop implementation 15 213 F 08 Processor State IA32 Partial Information about currently executing program eax edx ecx ebx Temporary data esi Location of current code control point edi esp Current stack top Location of runtime stack ebp Current stack frame Status of recent tests eip Instruction pointer CF 2 General purpose registers ZF SF OF Condition codes 15 213 F 08 Condition Codes Single Bit Registers CF Carry Flag SF Sign Flag ZF Zero Flag OF Overflow Flag Implicitly Set By Arithmetic Operations addl Src Dest addq Src Dest C analog t a b a Src b Dest CF set if carry out from most significant bit Used to detect unsigned overflow ZF set if t 0 SF set if t 0 OF set if two s complement overflow a 0 b 0 t 0 a 0 b 0 t 0 Not set by lea inc or dec instructions 3 15 213 F 08 Setting Condition Codes cont Explicit Setting by Compare Instruction cmpl Src2 Src1 4 cmpq Src2 Src1 cmpl b a like computing a b without setting destination CF set if carry out from most significant bit Used for unsigned comparisons ZF set if a b SF set if a b 0 OF set if two s complement overflow a 0 b 0 a b 0 a 0 b 0 ab 0 15 213 F 08 Setting Condition Codes cont Explicit Setting by Test instruction testl Src2 Src1 testq Src2 Src1 5 Sets condition codes based on value of Src1 Src2 Useful to have one of the operands be a mask testl b a like computing a b without setting destination ZF set when a b 0 SF set when a b 0 15 213 F 08 Reading Condition Codes SetX Instructions 6 Set single byte based on combinations of 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 15 213 F 08 Reading Condition Codes Cont SetX Instructions Set single byte based on combinations of condition codes One of 8 addressable byte registers Embedded within first 4 integer registers Does not alter remaining 3 bytes Typically use movzbl to finish job Body int gt int x int y return x y movl 12 ebp eax cmpl eax 8 ebp setg al movzbl al eax 7 eax y Compare x y al x y Zero rest of eax eax ah al edx dh dl ecx ch cl ebx bh bl esi edi esp ebp Note inverted ordering 15 213 F 08 Reading condition codes x86 64 SetX Instructions Set single byte based on combinations of condition codes Does not alter remaining 7 bytes int gt long x long y x86 64 arguments x in rdi return x y y in rsi Body same for both xorl eax eax cmpq rsi rdi setg al 8 long lgt long x long y return x y 32 bit instructions set high order 32 bits to 0 eax 0 Compare x y al x y 15 213 F 08 jX Instructions 9 Jumping Jump to different part of code depending on condition codes 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 15 213 F 08 Conditional Branch Example int absdiff int x int y int result if x y result x y else result y x return result 10 absdiff pushl movl movl movl cmpl jle subl movl L8 leave ret L7 subl jmp ebp esp ebp 8 ebp edx 12 ebp eax eax edx L7 eax edx edx eax Set Up Body1 Finish edx eax L8 Body2 15 213 F 08 Conditional Branch Example Cont int goto ad int x int y C allows goto as means of transferring control int result Closer to machine level if x y goto Else result x y programming style Exit Generally considered bad return result coding style Else result y x goto Exit x in edx y in eax cmpl eax edx Compare x y jle L7 Goto Else Body1 subl eax edx x y movl edx eax result x L8 Exit Body2 11 L7 Else subl edx eax jmp L8 result y x Goto Exit 15 213 F 08 General Conditional Expression Translation C Code val Test Then Expr Else Expr val x y x y y x Goto Version nt Test if nt goto Else val Then Expr Done Else val Else Expr goto Done 12 Test is expression returning integer 0 interpreted as false 0 interpreted as true Create separate code regions for then else expressions Execute appropriate one 15 213 F 08 Conditionals x86 64 int absdiff int x int y int result if x y result x y else result y x return result 13 absdiff x in edi movl edi eax movl esi edx subl esi eax subl edi edx cmpl esi edi cmovle edx eax ret y in esi v x ve y v y ve x x y v ve if Conditional move instruction cmovC src dest Move value from src to dest if condition C holds More efficient than conditional branching Simple predictable control flow 15 213 F 08 General Form with Conditional Move C Code val Test Then Expr Else Expr Conditional Move Version Both values get computed Overwrite then value with elsevalue if condition doesn t hold val Then Expr vale Else Expr val vale if Test 14 15 213 F 08 Limitations of Conditional Move val Then Expr vale Else Expr val vale if Test int xgty 0 xltey 0 int absdiff se int x int y int result if x y xgty result x y else xltey result y x return result 15 Don t use when Then Expr or Else Expr has side effect Then Expr or Else Expr requires significant computation 15 213 F 08 Implementing Loops IA32 All loops translated into form based on do while x86 64 Also make use of jump to middle Why the Difference 16 IA32 compiler developed for machine where all operations costly x86 64 compiler developed for machine where unconditional branches incur almost no overhead 15 213 F 08 Do While Loop Example C Code Goto Version int fact do int x int result 1 do result x x x 1 while x 1 return result 17 int fact goto int x int result 1 loop result x x x 1 if x 1 goto loop return result Use backward branch to continue looping …
View Full Document