1 / 34

MIPS Branches and Procedures

This text discusses branch instructions and procedures in MIPS computer architecture and assembly language.

dalexis
Download Presentation

MIPS Branches and Procedures

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 14:332:331Computer Architecture and Assembly LanguageSpring 06Week 3 : Braches and Procedures [Adapted from Dave Patterson’s UCB CS152 slides and Mary Jane Irwin’s PSU CSE331 slides]

  2. Fetch Exec Decode Review: MIPS Organization • Arithmetic instructions – to/from the register file • Load/store word and byte instructions – from/to memory Memory Processor 1…1100 Register File read/write addr src1 addr src1 data 5 32 src2 addr 32 registers ($zero - $ra) 5 32 230 words dst addr 5 src2 data read data write data 32 32 32 32 bits write data 0…1100 32 32 0…1000 ALU 32 4 5 6 7 0…0100 32 0 1 2 3 0…0000 32 bits byte address (big Endian) word address (binary)

  3. Review: MIPS Instructions, so far

  4. Instructions for Making Decisions • Decision making instructions • alter the control flow • i.e., change the "next" instruction to be executed • Why do we need decision making instructions? if (i==j) h = i + j; • MIPS conditional branch instructions:bne $s0, $s1, Label #go to Label if $s0$s1 beq $s0, $s1, Label #go to Label if $s0=$s1 • Example:if (i==j) h = i + j;

  5. 5 16 17 ???? 4 16 17 ???? op rs rt 16 bit number Assembling Branches • Instructions: bne $s0, $s1, Label #go to Label if $s0$s1 beq $s0, $s1, Label #go to Label if $s0=$s1 • Machine Formats: • How is the branch destination address specified? 5 bits 5 bits 6 bits I format

  6. PC Lab1+PC: Specifying Branch Destinations • Could use a register (like lw and sw) and add to it the 16-bit offset • which register? • Instruction Address Register (PC = program counter) • its use is automatically implied by instruction • PC gets updated (PC+4) during the fetch cycle so that it holds the address of the next instruction bne $s0,$s1,Lab1 • limits the offset to -215 to +215-1 from the (instruction after the) branch instruction, but • most branches are local anyway (principle of locality) • One optimization • Each instruction is 4 bytes long, and only word address is necessary (multiple of 4) • We can right shift the offset by 2 bits (divided by 4), and store the value • Essentially, it can cover -217 to +217-1 offset add $s3,$s0,$s1 ...

  7. ? Disassembling Branch Destinations • The contents of the updated PC (PC+4) is added to the low order 16 bits of the branch instruction which is converted into a 32 bit value by • concatenating two low-order zeros to create an 18 bit number • sign-extending those 18 bits • The result is written into the PC if the branch condition is true prior to the next Fetch cycle Why?? from the low order 16 bits of the branch instruction 16 offset sign-extend 00 branch dst address 32 32 Add PC 32 32 Add 32 4 32 32

  8. op rs rt 16 bit offset Assembling Branches Example • Assembly code bne $s0, $s1, Lab1 add $s3, $s0, $s1Lab1: ... • Machine Format of bne: I format 5 16 17 • Remember • After the bne instruction is fetched, the PC is updated to address the add instruction (PC = PC + 4). • Two low-order zeros are concatenated to the offset number and that value sign-extended is added to the (updated) PC

  9. Fetch PC = PC+4 Exec Decode MIPS Organization Processor Memory Register File 1…1100 src1 addr src1 data 5 32 src2 addr 32 registers ($zero - $ra) 5 dst addr read/write addr 5 src2 data write data 32 230 words 32 32 32 bits br offset read data 32 Add PC 32 32 32 32 Add 32 4 write data 0…1100 32 0…1000 32 4 5 6 7 0…0100 32 ALU 0 1 2 3 0…0000 32 word address (binary) 32 bits 32 byte address (big Endian)

  10. Another Instruction for Changing Flow • MIPS also has an unconditional branch instruction or jump instruction:j label #go to label • Example: if (i!=j) h=i+j; else h=i-j;

  11. 2 ???? Assembling Jumps • Instruction: j label #go to label • Machine Format: • How is the jump destination address specified? • As an absolute address formed by • concatenating the upper 4 bits of the current PC (now PC+4) to the 26-bit address and • concatenating 00 as the 2 low-order bits J format op 26-bit address

  12. Disassembling Jump Destinations • to create a 32 bit instruction address that is placed into the PC prior to the next Fetch cycle from the low order 26 bits of the jump instruction 26 00 32 32 PC 32

  13. Assembling Branches and Jumps • Assemble the MIPS machine code (in decimal is fine) for the following code sequence. Assume that the address of the beq instruction is 0x00400020 (hex address) beq $s0, $s1, Lab1 add $s3, $s0, $s1 j Lab2Lab1: sub $s3, $s0, $s1Lab2: ...

  14. Compiling While Loops • Compile the assembly code for the C while loop where i is in $s0, j is in $s1, and k is in $s2 while (i!=k) i=i+j;

  15. More Instructions for Making Decisions • We have beq, bne, but what about branch-if-less-than? • New instruction: slt $t0, $s0, $s1 # if $s0 < $s1 # then # $t0 = 1 # else # $t0 = 0 • Machine format: op rs rt rd funct 0 16 17 8 0 42 = 0x2a 2

  16. Other Branch Instructions • Can use slt, beq, bne, and the fixed value of 0 in register $zero to create all relative conditions • less than blt $s1, $s2, Label • less than or equal to ble $s1, $s2, Label • greater than bgt $s1, $s2, Label • great than or equal to bge $s1, $s2, Label • As pseudo instructions - recognized (and expanded) by the assembler • The assembler needs a reserved register ($at) • there are policy of use conventions for registers

  17. Another Instruction for Changing Flow • Most higher level languages have case or switch statements allowing the code to select one of many alternatives depending on a single value. • Instruction: jr $t1 #go to address in $t1 • Machine format: op rs funct 0 9 0 0 0 8 = 0x08 2

  18. Compiling a Case (Switch) Statement switch (k) { case 0: h=i+j; break; /*k=0*/ case 1: h=i+h; break; /*k=1*/ case 2: h=i-j; break; /*k=2*/

  19. Instructions, so far

  20. Logic Operations • Logic operations operate on individual bits of the operand. $t2 = 0…0 0000 1101 0000 $t1 = 0…0 0011 1100 0000 and $t0, $t1, $t2 $t0 = or $t0, $t1 $t2 $t0 = xor $t0, $t1, $t2 $t0 = nor $t0, $t1, $t2 $t0 =

  21. Logical Operations - Shifts • They move all the bits in a word to the left or right, filling the emptied bits with 0s. • sll $t2, $s0, 4 # shift left • srl $t2, $s0, 4 # shift right op rs rt rd shamt funct 0 0 16 10 4 0 • Shifting left by i bits gives the same result as multiplying by 2i.

  22. Procedures int leaf_example (int g, int h, int i, int j) { int f; f = (g+h) – (i+j); return f; } void main(){ int f; f = leaf_example(1, 2, 3, 4); f ++; } CALLEE CALLER

  23. Six Steps in Execution of a Procedure • Main routine (caller) places actual parameters in a place where the procedure (callee) can access them • $a0 - $a3: four argument registers • Caller transfers control to the callee • Callee acquires the storage resources needed • Callee performs the desired task • Callee places the result value in a place where the caller can access it • $v0 - $v1: two value registers for result values • Callee returns control to the caller • $ra: one return address register to return to the point of origin

  24. Instruction for Calling a Procedure • MIPS procedure call instruction (caller): jal ProcedureAddress #jump and link • Saves PC+4 in register $ra • Jump to address ProcedureAddress • Then (callee) can do procedure return with just jr $ra #return

  25. Compiling a Procedure int leaf_example (int g, int h, int i, int j) { int f; f = (g+h) – (i+j); return f;}

  26. MIPS Register Convention

  27. Spilling Registers • Where does the callee save those registers? • it uses a stack – a last-in-first-out queue high addr • One of the general registers, $sp, is used to address the stack (which “grows” from high address to low address) • add data onto the stack – push • $sp = $sp – 4 data on stack at new $sp • remove data from the stack – pop • data from stack at $sp $sp = $sp + 4 top of stack $sp low addr

  28. A Quick Aside • MIPS instruction for adding immediate values:addi $sp, $sp, 4 #$sp = $sp + 4 addi $sp, $sp, -4 #$sp = $sp - 4 • Another version of add in which one operand is a constant where the constant is kept inside the instruction itself • MIPS pseudoinstruction for multiplying:mul $v0, $a0, $v0 #$v0 = $a0 * $v0 • We will look at the machine representations for these instructions in the next lecture

  29. Nested Procedures • What happens to return addresses with nested procedures? int rt_1 (int i) { if (i == 0) return 0; else return rt_2(i-1); } caller: jal rt_1next: . . . rt_1: bne $a0, $zero, to_2 add $v0, $zero, $zero jr $ra to_2: addi $a0, $a0, -1 jal rt_2 jr $ra rt_2: . . .

  30. Nested Procedures Outcome caller: jal rt_1next: . . . rt_1: bne $a0, $zero, to_2 add $v0, $zero, $zero jr $ra to_2: addi $a0, $a0, -1 jal rt_2 jr $ra rt_2: . . . • On the call to rt_1, the return address (next in the caller routine) gets stored in $ra. What happens to the value in $ra (when i != 0) when rt_1 makes a call to rt_2?

  31. Saving the Return Address • Nested procedures (i passed in $a0, return value in $v0) rt_1: bne $a0, $zero, to_2 add $v0, $zero, $zero jr $ra to_2: addi $sp, $sp, -8 sw $ra, 4($sp) sw $a0, 0($sp) addi $a0, $a0, -1 jal rt_2 bk_2: lw $a0, 0($sp) lw $ra, 4($sp) addi $sp, $sp, 8 jr $ra • Save the return address (and arguments) on the stack high addr old TOS  $sp low addr $ra

  32. Compiling a Recursive Procedure • Calculating factorial: int fact (int n) { if (n < 1) return 1; else return (n * fact (n-1)); } • Recursive procedure (one that calls itself!) fact (0) = 1 fact (1) = 1 * 1 = 1 fact (2) = 2 * 1 * 1 = 2 fact (3) = 3 * 2 * 1 * 1 = 6 fact (4) = 4 * 3 * 2 * 1 * 1 = 24 . . . • Assume n is passed in $a0; result returned in $v0

  33. Compiling a Recursive Procedure fact: addi $sp, $sp, -8 #adjust stack pointer sw $ra, 4($sp) #save return address sw $a0, 0($sp) #save argument n slt $t0, $a0, 1 #test for n < 1 beq $t0, $zero, L1 #if n >=1, go to L1 addi $v0, $zero, 1 #else return 1 in $v0 addi $sp, $sp, 8 #adjust stack pointer jr $ra #return to caller L1: addi $a0, $a0, -1 #n >=1, so decrement n jal fact #call fact with (n-1) #this is where fact returns bk_f: lw $a0, 0($sp) #restore argument n lw $ra, 4($sp) #restore return address addi $sp, $sp, 8 #adjust stack pointer mul $v0, $a0, $v0 #$v0 = n * fact(n-1) jr $ra #return to caller

  34. Review: MIPS Instructions, so far

More Related