Download presentation
Presentation is loading. Please wait.
Published byMadlyn Lucas Modified over 8 years ago
1
1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Carnegie Mellon Machine-Level Programming IV Control Comp 21000: Introduction to Computer Organization & Systems March 2016 Systems book chapter 3* Ithaca College
2
2 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Ithaca College Today Control: Condition codes Conditional branches Loops Switch Statements
3
3 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Processor State (x86-64, Partial) Information about currently executing program Temporary data ( %rax, … ) Location of runtime stack ( %rsp ) Location of current code control point ( %rip, … ) Status of recent tests ( CF, ZF, SF, OF ) %rip Registers Current stack top Instruction pointer CFZFSFOF Condition codes %rsp %r8 %r9 %r10 %r11 %r12 %r13 %r14 %r15 %rax %rbx %rcx %rdx %rsi %rdi %rbp Ithaca College
4
4 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Condition Codes (Implicit Setting) Single bit registers CF Carry Flag (for unsigned)SF Sign Flag (for signed) ZF Zero FlagOF Overflow Flag (for signed) Implicitly set (think of it as side effect) by arithmetic operations Example: addq Src,Dest ↔ t = a+b CF set if carry out from most significant bit (unsigned overflow) ZF set if t == 0 SF set if t < 0 (as signed) OF set if two’s-complement (signed) overflow (a>0 && b>0 && t =0) Not set by leaq instruction Ithaca College
5
5 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Condition Codes Examples: assume %rax contains 20 addl $10, %raxCF 0 ZF 0 SF 0 OF 0 subl $50, %raxCF 0 ZF 0 SF 1 OF 0 Note that these flags are set just like we talked about in chapter 2!
6
6 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Condition Codes Single Bit Registers CF Carry Flag SF Sign Flag ZF Zero Flag OF Overflow Flag Also implicitly Set By logical Operations xorl Src,Dest C analog: t = a ^ b(a = Src, b = Dest) CF set to 0 ZF set if t == 0 SF set if t < 0 OF set to 0 For shift operations: CF set to last bit shifted out OF set to 0
7
7 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Condition Codes (Implicit Setting) There are no Boolean types in assembly language. There is no concept of Boolean operators in assembly language. So what is there? Bits All we can do is look at bits. What those bits mean is determined by the context of the program. Instructions set flags. Other instructions take action based on the bits in those flags. Don’t think about it as comparison as in the C language sense.
8
8 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Condition Codes (Explicit Setting: Compare) Explicit Setting by Compare Instruction cmpq Src2, Src1 cmpq 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 (as signed) OF set if two’s-complement (signed) overflow (a>0 && b 0 && (a-b)>0) Note: notice that the operands are in reverse order; b is the first operand, but we compute a – b! Note 2: there are also cmpw and cmpb instructions. Ithaca College
9
9 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Example cmpl %rax, %rcx do %rcx - %rax then set condition codes NO other action taken! %rax 0000 %rcx 00000010 %rdx 0000 %rbx 0000 %rsi %rdi %rsp %rbp CFZFSFOF Condition codes ??
10
10 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Example cmpl %rax, %rcx do %rcx - %rax then set condition codes NO other action taken! %rax 0000 %rcx 00000010 %rdx 0000 %rbx 0000 %rsi %rdi %rsp %rbp CFZFSFOF Condition codes 0000
11
11 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Condition Codes (Explicit Setting: Test) Explicit Setting by Test instruction testq Src2, Src1 testq b,a like computing a&b without setting destination Sets condition codes based on value of Src1 & Src2 Useful to have one of the operands be a mask CF set to 0 ZF set when a&b == 0 SF set when a&b < 0 OF set to 0 Note: typically the same operand is repeated to test whether it is negative, zero, or positive: testl %rax, %rax sets the condition codes depending on the value in %rax Note 2: there are also testl, testw and testb instructions. Ithaca College
12
12 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Reading Condition Codes SetX Instructions Set low-order byte of destination to 0 or 1 based on combinations of condition codes Does not alter remaining 7 bytes SetXConditionDescription seteZF Equal / Zero setne~ZF Not Equal / Not Zero setsSF 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) setbCF Below (unsigned) Ithaca College
13
13 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition %rsp x86-64 Integer Registers Can reference low-order byte %bl %cl %dl %sil %dil %spl %bpl %r8b %r9b %r10b %r11b %r12b %r13b %r14b %r15b %r8 %r9 %r10 %r11 %r12 %r13 %r14 %r15 %rax %rbx %rcx %rdx %rsi %rdi %rbp %al
14
14 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Reading condition codes Consider: setl D (SF^OF)Less (Signed <)D (SF^OF ) First compare two numbers, a and b where both are in 2’s complement form using an arithmetic, logical, test or cmp instruction Then use setX to set a register with the result of the test cmpq%rax, %rdx setl %al puts the result in byte register %al
15
15 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Reading condition codes (cont) Assume a is in %rax and b in %rdx cmpq%rax, %rdx setl %al puts the result in byte register %al First instruction sets the condition code. cmpq computes b – a If b < a then b – a < 0 If there is no overflow, this is indicated by SF If there is positive overflow (b – a is large), we have b – a < 0 but OF is set If there is negative overflow (b – a is very small), we have b – a > 0 but OF is set In either case the sign flag will indicate the opposite of the sign of the true difference. Hence, use exclusive-or of the OF and SF Second instruction sets the %al register to 00000000 or 00000001 depending on the value of (SF^OF) setl D ; D (SF^OF )
16
16 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Reading condition codes (cont) Example: assume %rax holds 20 and %rdx holds 50 cmpq%rax, %rdx 50 – 20, SF 0, OF 0 setl %al %al 0 ^ 0 = 00000000 Example: assume %rax holds 0x8000001 and %rdx holds 20 cmpq%rax, %rdx 20 – (-2147483647), SF 1, OF 1 setl %al %al 1 ^ 1 = 00000000setq gives false; 20 is not less than -2147483647 setl D ; D (SF^OF )
17
17 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Reading condition codes (cont) Example: assume %rax holds 20 and %rdx holds 0x8000001 cmpq%rax, %rdx (-2147483647) - 20, SF 0, OF 1 0x80000001 + 0xFFFFFFEC = 0x7FFFFFED (note that 7 = 0111) setl %al %al 0 ^ 1 = 00000001setq gives true; -2147483647 is less than 20
18
18 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Setg Greater (Signed) ~(SF^OF)&~ZF CFZFSFOF Condition codes ~SF&~OF If this is zero, can’t be > If the overflow flag is set, can’t be > if we did a cmpl or testl as the previous instruction. Why? First do an arith, logical, cmp or test. Then use the flags
19
19 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition cmpq %rsi, %rdi # Compare x:y setg %al # Set when > movzbl %al, %rax # Zero rest of %rax ret Reading Condition Codes (Cont.) SetX Instructions: Set single byte based on combination of condition codes One of addressable byte registers Does not alter remaining bytes Typically use movzbl to finish job 32-bit instructions also set upper 32 bits to 0 int gt (long x, long y) { return x > y; } int gt (long x, long y) { return x > y; } RegisterUse(s) %rdi Argument x %rsi Argument y %rax Return value Ithaca College
20
20 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition cmpq %rsi, %rdi # Compare x:y setg %al # Set when > movzbl %al, %rax # Zero rest of %rax ret Reading Condition Codes (Cont.) int gt (long x, long y) { return x > y; } int gt (long x, long y) { return x > y; } RegisterUse(s) %rdi Argument x %rsi Argument y %rax Return value %rax %rdx %rcx %rbx %rsi %rdi %rsp %rbp %al%ah %dl%dh %cl%ch %bl%bh All 0’s: 0000000000000000000000000 Either 00000000 or 00000001 Ithaca College
21
21 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Today Control: Condition codes Conditional branches Loops Switch Statements Ithaca College
22
22 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Jumping A jump instruction causes execution to jump to a new address Really just puts the argument of the jump into the EIP Jump destinations are usually indicated by a label A label marks a place in code 1xorq%rax, %rax 2jmp.L1 3movq(%rax), %rdx 4.L1: popq %rdx The instruction jmp.L1 causes program to skip line 3 jmp is an unconditional jump instruction Note that we wouldn’t really use the code this way!
23
23 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Jumping A jump instruction has two types of arguments Direct jumps. Target is part of the instruction Use a label Indirect jumps. Target read from a register or memory. Use a ‘*’ followed by an operand specifier jmp *%eax or jmp *(%eax) Any addressing mode can be used Note that jmp is an unconditional jump instruction
24
24 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Jumping Other jump instructions are conditional Either jump or continue executing at next instruction in the code Depends on some combination of the condition codes Names and conditions match the set instructions. Conditional jumps can only be direct Assembler changes labels into actual memory addresses See section 3.6.3 of the book Not very important now; will be very important in chapter 7
25
25 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Jumping jX Instructions Jump to different part of code depending on condition codes jXConditionDescription jmp1 Unconditional jeZF Equal / Zero jne~ZF Not Equal / Not Zero jsSF 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) jbCF Below (unsigned) Ithaca College
26
26 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition jg Greater (Signed) ~(SF^OF)&~ZF CFZFSFOF Condition codes ~SF&~OF If this is zero, can’t be > If the overflow flag is set, can’t be > if we did a cmpq or testq as the previous instruction. Why? First do an arith, logical, cmp or test. Then use the flags
27
27 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Conditional Branch Example (Old Style) long absdiff (long x, long y) { long result; if (x > y) result = x-y; else result = y-x; return result; } long absdiff (long x, long y) { long result; if (x > y) result = x-y; else result = y-x; return result; } absdiff: cmpq %rsi, %rdi # x:y jle.L4 movq %rdi, %rax subq %rsi, %rax ret.L4: # x <= y movq %rsi, %rax subq %rdi, %rax ret Generation nori> gcc –Og -S –fno-if-conversion control.c RegisterUse(s) %rdi Argument x %rsi Argument y %rax Return value Ithaca College
28
28 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Expressing with Goto Code long absdiff (long x, long y) { long result; if (x > y) result = x-y; else result = y-x; return result; } long absdiff (long x, long y) { long result; if (x > y) result = x-y; else result = y-x; return result; } C allows goto statement Jump to position designated by label long absdiff_j (long x, long y) { long result; int ntest = x <= y; if (ntest) goto Else; result = x-y; goto Done; Else: result = y-x; Done: return result; } long absdiff_j (long x, long y) { long result; int ntest = x <= y; if (ntest) goto Else; result = x-y; goto Done; Else: result = y-x; Done: return result; } Ithaca College Generally considered bad coding style
29
29 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Expressing with Goto Code C allows goto statement Jump to position designated by label long absdiff_j (long x, long y) { long result; int ntest = x <= y; if (ntest) goto Else; result = x-y; goto Done; Else: result = y-x; Done: return result; } long absdiff_j (long x, long y) { long result; int ntest = x <= y; if (ntest) goto Else; result = x-y; goto Done; Else: result = y-x; Done: return result; } Ithaca College absdiff: cmpq %rsi, %rdi # x:y jle.L4 movq %rdi, %rax subq %rsi, %rax ret.L4: # x <= y movq %rsi, %rax subq %rdi, %rax ret RegisterUse(s) %rdi Argument x %rsi Argument y %rax Return value
30
30 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Expressing with Goto Code C allows goto statement Jump to position designated by label long absdiff_j (long x, long y) { long result; int ntest = x <= y; if (ntest) goto Else; result = x-y; goto Done; Else: result = y-x; Done: return result; } long absdiff_j (long x, long y) { long result; int ntest = x <= y; if (ntest) goto Else; result = x-y; goto Done; Else: result = y-x; Done: return result; } Ithaca College absdiff: cmpq %rsi, %rdi # x:y jle.L4 movq %rdi, %rax subq %rsi, %rax ret.L4: # x <= y movq %rsi, %rax subq %rdi, %rax ret RegisterUse(s) %rdi Argument x %rsi Argument y %rax Return value
31
31 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Expressing with Goto Code C allows goto statement Jump to position designated by label long absdiff_j (long x, long y) { long result; int ntest = x <= y; if (ntest) goto Else; result = x-y; goto Done; Else: result = y-x; Done: return result; } long absdiff_j (long x, long y) { long result; int ntest = x <= y; if (ntest) goto Else; result = x-y; goto Done; Else: result = y-x; Done: return result; } Ithaca College absdiff: cmpq %rsi, %rdi # x:y jle.L4 movq %rdi, %rax subq %rsi, %rax ret.L4: # x <= y movq %rsi, %rax subq %rdi, %rax ret RegisterUse(s) %rdi Argument x %rsi Argument y %rax Return value
32
32 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Expressing with Goto Code C allows goto statement Jump to position designated by label long absdiff_j (long x, long y) { long result; int ntest = x <= y; if (ntest) goto Else; result = x-y; goto Done; Else: result = y-x; Done: return result; } long absdiff_j (long x, long y) { long result; int ntest = x <= y; if (ntest) goto Else; result = x-y; goto Done; Else: result = y-x; Done: return result; } Ithaca College absdiff: cmpq %rsi, %rdi # x:y jle.L4 movq %rdi, %rax subq %rsi, %rax ret.L4: # x <= y movq %rsi, %rax subq %rdi, %rax ret RegisterUse(s) %rdi Argument x %rsi Argument y %rax Return value
33
33 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Example 2 Download ifStmt.c gcc –O0 –o ifStmt –fno-if-conversion ifStmt.c gdb ifStmt In gdb: disass testIf1 int testIf1(int x, int y) { int result; if (x < y) result = x * 4; else result = y * 4; return result; }
34
34 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Example 2 continued… pushq %rbp movq %rsp, %rbp movq %rdi, -8(%rbp) movq %rsi, -16(%rbp) movq -8(%rbp), %rsi cmpq -16(%rbp), %rsi jge LBB0_2 movq -8(%rbp), %rax shlq $2, %rax movq %rax, -24(%rbp) jmp LBB0_3 LBB0_2: movq -16(%rbp), %rax shlq $2, %rax movq %rax, -24(%rbp) LBB0_3: movq -24(%rbp), %rax popq %rbp retq Setting up the runtime stack if x - y >= 0 jump if x - y >= 0 jump else calculate x=x*4 and jump else calculate x=x*4 and jump Calculate y=y*4 Set up the return value RegisterUse(s) %rdi Argument x %rsi Argument y %rax Return value int testIf1(int x, int y) { int result; if (x < y) result = x * 4; else result = y * 4; return result; }
35
35 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition C Code val = Test ? Then_Expr : Else_Expr ; Goto Version ntest = ! Test ; if (ntest) goto Else; val = Then_Expr ; goto Done; Else: val = Else_Expr ; Done:... ntest = ! Test ; if (ntest) goto Else; val = Then_Expr ; goto Done; Else: val = Else_Expr ; Done:... General Conditional Expression Translation (Using Branches) Test Is an expression returning an integer = 0 interpreted as false ≠ 0 interpreted as true Create separate code regions for then & else expressions Execute appropriate one val = x>y ? x-y : y-x; Ithaca College
36
36 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition C Code val = Test ? Then_Expr : Else_Expr ; val = Test ? Then_Expr : Else_Expr ; Goto Version result = Then_Expr ; eval = Else_Expr ; nt = ! Test ; if (nt) result = eval; return result; result = Then_Expr ; eval = Else_Expr ; nt = ! Test ; if (nt) result = eval; return result; Using Conditional Moves Conditional Move Instructions Instruction supports: if (Test) Dest Src Supported in post-1995 x86 processors GCC tries to use them But, only when known to be safe Why? Branches are very disruptive to instruction flow through pipelines Conditional moves do not require control transfer Ithaca College
37
37 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Conditional Move cmovX Instructions Jump to different part of code depending on condition codes jXSynonymConditionDescription cmove S*,R*cmovzZF Equal / Zero cmovne S,Rcmovnz~ZF Not Equal / Not Zero cmovs S,RSF Negative cmovns S,R~SF Nonnegative cmovg S,Rcmovnle~(SF^OF)&~ZF Greater (Signed) cmovge S,Rcmovnl~(SF^OF) Greater or Equal (Signed) cmovl S,Rcmovnge(SF^OF) Less (Signed) cmovle S,Rcmovng(SF^OF)|ZF Less or Equal (Signed) cmova S,Rcmovnbe~CF&~ZF Above (unsigned) cmovae S,Rcmovnb~CF Above or equal (unsigned) cmovb S,RcmovnaeCF Below (unsigned) cmovbe S,RcmovnaCF | ZF Below or equal (unsigned) Ithaca College * source/destination may be 16, 32, or 64 bits (not 8). No size suffix: assembler infers the operand length based on destination register
38
38 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Conditional Move Example absdiff: movq %rdi, %rax # x subq %rsi, %rax # result = x-y movq %rsi, %rdx subq %rdi, %rdx # eval = y-x cmpq %rsi, %rdi # x:y cmovle %rdx, %rax # if <=, result = eval ret long absdiff (long x, long y) { long result; if (x > y) result = x-y; else result = y-x; return result; } long absdiff (long x, long y) { long result; if (x > y) result = x-y; else result = y-x; return result; } RegisterUse(s) %rdi Argument x %rsi Argument y %rax Return value Ithaca College
39
39 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Expensive Computations Bad Cases for Conditional Move Both values get computed Only makes sense when computations are very simple val = Test(x) ? Hard1(x) : Hard2(x); Risky Computations Both values get computed May have undesirable effects (always dereference p but it may be null!) val = p ? *p : 0; Computations with side effects Both values get computed Must be side-effect free val = x > 0 ? x*=7 : x+=3; Ithaca College In general, gcc only uses conditional moves when the two expressions can be computed very easily, e.g., single instructions.
40
40 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Practice Problem long test (long x, long y) { long val = _________; if (_________){ if (__________){ val = ________; else val = ________; } else if (________) val = ________; return val; } long test (long x, long y) { long val = _________; if (_________){ if (__________){ val = ________; else val = ________; } else if (________) val = ________; return val; } test: leaq0(,%rdi,8), %rax testq%rsi, %rsi jle.L4 movq %rsi, %rax subq %rdi, %rax movq%rdi, %rdx andq %rsi, %rdx cmpq %rsi, %rdi cmovge%rdx, %rax ret.L4: # x <= y addq%rsi, %rdi cmpq%-2, %rsi cmovle%rdi, %rax ret Generation RegisterUse(s) %rdi Argument x %rsi Argument y %rax Return value Ithaca College
41
41 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Practice Problem long test (long x, long y) { long val = 8*x; if (y > 0){ if (x < y){ val = y - x; else val = x & y; } else if (y <= -2) val = x + y; return val; } long test (long x, long y) { long val = 8*x; if (y > 0){ if (x < y){ val = y - x; else val = x & y; } else if (y <= -2) val = x + y; return val; } test: leaq0(,%rdi,8), %rax testq%rsi, %rsi jle.L4 movq %rsi, %rax subq %rdi, %rax movq%rdi, %rdx andq %rsi, %rdx cmpq %rsi, %rdi cmovge%rdx, %rax ret.L4: # x <= y addq%rsi, %rdi cmpq%-2, %rsi cmovle%rdi, %rax ret Generation RegisterUse(s) %rdi Argument x %rsi Argument y %rax Return value Ithaca College
42
42 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Summarizing C Control if-then-else do-while while, for switch Assembler Control Conditional jump Conditional move Indirect jump (via jump tables) Compiler generates code sequence to implement more complex control Standard Techniques Loops converted to do-while or jump-to-middle form Large switch statements use jump tables Sparse switch statements may use decision trees (if-elseif-elseif-else) Ithaca College
43
43 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Summary Today Control: Condition codes Conditional branches & conditional moves Next Time Loops Switch statements Stack Call / return Procedure call discipline Ithaca College
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.