ta2 spring 200 6 amar lior based on lectures notes from
play

Ta2 Spring 200 6 Amar Lior Based on lectures notes from Arie - PDF document

Ta2 Spring 200 6 Amar Lior Based on lectures notes from Arie Schlesinger Adapted from Computer Organization&Design, H/S interface, Patterson Hennessy@UCB,1999 1 Data transfer: Register to Memory Store:


  1. הנבמ םיבשחמ Ta2 Spring 200 6 Amar Lior Based on lectures notes from Arie Schlesinger Adapted from Computer Organization&Design, H/S interface, Patterson Hennessy@UCB,1999 1 Data transfer: Register to Memory � Store: complementary instruction to load � MIPS: sw for Store Word, same syntax as lw � Example: A[12] = h ; � base address of A: $s3, h: $s2 � MIPS assembly instructions: sw $s2,48($s3) # h into A[12] 2 Compile with variable index � What if array index not a constant? g = h + A[i]; � g: $s1 , h: $s2 , i: $s4 , $s3 : base address of A � To load A[i] into a register, first turn i into a byte address; multiply by 4 Creating � How multiply using adds? 4i � i + i = 2i, 2i + 2i = 4i add $t1,$s4,$s4 # $t1 = 2*i add $t1,$t1,$t1 # $t1 = 4*i 3 1

  2. Compile with variable index, con’t � Next add to base of A: add $t1,$t1,$s3 # $t1=address of # A[i] (4*i+$s3) � Now load A[i] into a temporary register: lw $t0,0($t1) # Temp $t0 = A[i] � Finally add to h and put sum in g : add $s1,$s2,$t0 # g = h + A[i] 4 Compile with variable index: Summary � C statement: g = h + A[i]; � Compiled MIPS assembly instructions: add $t1,$s4,$s4 # $t1 = 2*i add $t1,$t1,$t1 # $t1 = 4*i add $t1,$t1,$s3 # $t1=addr A[i] lw $t0,0($t1) # $t0 = A[i] add $s1,$s2,$t0 # g = h + A[i] 5 Role of Registers vs. Memory � What if more variables than registers? � Compiler tries to keep most frequently used variable in registers � Writing less common to memory: spilling � Why not keep all variables in memory? � Smaller is faster: registers are faster than memory � Registers more versatile: � MIPS arithmetic instruction can read 2, operate on them, and write 1 per instruction � MIPS data transfer only read or write 1 operand per instruction, and no operation 6 2

  3. Class exercise � Compile this MIPS code: B[i] = h + A[i]; � h : $s2 , i : $s4 , $s3 : base address of A , $s5: base address of B 7 Class exercise � Compile this C code into MIPS: B[i] = h + A[i]; � h : $s2 , i : $s4 , $s3 :base address of A , $s5: base address of B add $t1,$s4,$s4 # $t1 = 2*i add $t1,$t1,$t1 # $t1 = 4*i add $t2,$t1,$s3 # $t2=addr A[i] lw $t0,0($t2) # $t0 = A[i] add $t0,$s2,$t0 # $t0 = h+A[i] add $t3,$t1,$s5 # $t3=addr B[i] sw $t0,0($t3) # B[i]= h+A[i] 8 Conclusion ... Design of an Assembly Language like MIPS shaped by 1) Desire to keep hardware simple: e.g., each operation has 3 operands 2) Smaller is faster: e.g., MIPS has 32 registers 9 3

  4. Conclusion ... � MIPS assembly language thus far: � Instructions: add, sub, lw, sw � At most one assembly instruction per line � Comments start with # to end of line � Operands: registers $s0, $s1, ... ; $t0, $t1, ... � Operands: memory Memory[0], Memory[4], Memory[8], ,... , Memory[4294967292] � Next: difference between computers and calculators: Making decisions 10 Assembly Constants � C expressions can have constants: i = i + 10 ; � How get them using instructions so far? � Constants kept in memory with program lw $t0, 0($s0) # load 10 from memory add $s3,$s3,$t0 # i = i + 10 � Constants are common, so there is an instruction to add constants ( “immediate instructions”) addi $s3,$s3,10 # i = i + 10 11 Assembly Constants Why include immediate instructions ? � Design principle: Make the common case fast � Why is it faster? � Don’t need to access memory (to load the constants with lw ) � 2 instructions v. 1 instruction � Most popular constant is zero � MIPS designers reserved 1 of 32 registers to always have the value 0; called “ $zero ” � Useful in making additional operations from existing instructions; � add $s0, $s1, $zero # $s0 = $s1 + 0 12 4

  5. C Decisions (Control Flow): if statements � 2 kinds of if statements in C � if ( condition ) statement � if ( condition ) statement1 else statement2 � Following code is the same as 2nd if if ( condition ) go to L1; statement2; go to L2; L1: statement1; L2: … //statement after if � Not as elegant as if-else, but has the same meaning 13 MIPS decision instructions (control flow) � Decision instruction in MIPS: � beq register1, register2, L1 � beq is “Branch if (registers 1, 2, are) equal” � In C: if (register1==register2) go to L1 � Complementary MIPS decision instruction � bne register1, register2, L1 � bne is “Branch if (registers are) not equal” � In C : if (register1 != register2) go to L1 � Called conditional branches 14 Compiling C if, into MIPS Assembly (false) (true) i == j? � Compile by hand i != j i == j if (i == j) f=g+h; else f=g-h; f=g+h f=g-h Mapping f : $s0 , g : $s1 , h : $s2 , i : $s3 , j : $s4 Exit � Start with branch : beq $s3,$s4, True # if i==j # branch to True (label) � Follow with else part sub $s0,$s1,$s2 # f = g - h(do if i!= j) 15 5

  6. Compiling C if, into MIPS Assembly � Next must skip over true part � Need instruction that always branches (unconditional branch) � MIPS has the “jump” instruction: j Exit # go to Exit � � Next is “true” part True: add $s0,$s1,$s2 # f=g+h � Followed by exit branch label Exit: 16 Compiling C if into MIPS: Summary (false) (true) i == j? i != j C � Compile by hand i == j if (i == j) f=g+h; else f=g-h; f=g+h f=g-h Mapping f : $s0 , g : $s1 , h : $s2 , i : $s3 , j : $s4 M I beq $s3,s4, True # branch i==j sub $s0,$s1,$s2 # f=g-h(false) P j Exit # go to Exit S True: add $s0,$s1,$s2 # f=g+h (true) Exit: � Note:Compiler supplies labels, branches not found in HLL code; often it flips the condition to branch to false part 17 Loops in C/Assembly � Simple loop in C Loop: g = g + A[i]; i = i + j; if (i != h) goto Loop; � 1st fetch A[i] ( g , h , i , j :$s1, $s2, $s3, $s4 ; base of A[] : $s5 ): Loop: add $t1,$s3,$s3 #$t1 = 2*i add $t1,$t1,$t1 #$t1 = 4*i add $t1,$t1,$s5 #$t1 = addr A lw $t1,0($t1) #$t1 = A[i] 18 6

  7. Loops in C /Assembly � Add A[i] to g, and then j to i � ( g , h , i , j : $s1, $s2, $s3, $s4 ): add $s1,$s1,$t1 # g = g+A[i] add $s3,$s3,$s4 # i = i + j The final instruction branches back to Loop if i != h : bne $s3,$s2,Loop # goto Loop # if i!=h 19 Loops in C/Assembly: Summary Loop: g = g + A[i]; C i = i + j; if (i != h) goto Loop; M ( g , h , i , j : $s1, $s2, $s3, $s4 ; I base of A[] :$s5) Loop: add $t1,$s3,$s3 # $t1 = 2*i P add $t1,$t1,$t1 # $t1 = 4*i S add $t1,$t1,$s5 # $t1 = addr A lw $t1,0($t1) # $t1 = A[i] add $s1,$s1,$t1 # g = g + A[i] add $s3,$s3,$s4 # I = i + j bne $s3,$s2,Loop # goto Loop # if i!= h 20 While in C / Assembly: � Although legal C, almost never write loops with if , goto : use while , for loops � Syntax: while ( condition ) statement while (save[i]==k) i = i + j; � 1st load save[i] into a temporary register : � ( i , j , k : $s3, $s4, $s5: base of save [] : $s6): Loop: add $t1,$s3,$s3 # $t1 = 2*i add $t1,$t1,$t1 # $t1 = 4*i add $t1,$t1,$s6 # $t1 = Addr lw $t1,0($t1) # $t1 = save[i] 21 7

  8. While in C / Assembly: � Loop test, exiting if save[i] != k ( i , j , k : $s3, $s4, $s5: base of save[] : $s6): bne $t1,$s5,Exit # goto Exit # if save[i]!=k � The next instruction adds j to i : add $s3,$s3,$s4 # i = i + j � End of loop branches back to the while test at top of loop. Add the Exit label after: j Loop # goto Loop Exit: 22 While in C / Assembly: Summary C while (save[i]==k) i = i + j; ( i , j , k : $s3, $s4, $s5: base of save[]: $ s6 ) Loop: add $t1,$s3,$s3 # $t1 = 2*i M add $t1,$t1,$t1 # $t1 = 4*i add $t1,$t1,$s6 # $t1 = Addr I lw $t1,0($t1) # $t1 = save[i] P bne $t1,$s5,Exit # goto Exit # if save[i]!=k S add $s3,$s3,$s4 # i = i + j j Loop # goto Loop Exit: 23 Beyond equality tests in MIPS Assembly � MIPS instruction “Set Less Than” , syntax : slt register1,register2,register3 � Meaning of slt in C : if (register2 < register 3) � register1 = 1; else register1 = 0; � Try ( in C ) : if (g < h) goto Less � 24 8

  9. If less in C / Assembly C if (g < h) go to Less M slt $t0, $s0, $s1 # $t0 = 1 if I # $s0 < $s1 (g < h) bne $t0,$zero,Less # goto Less P # if $t0!=0 S . . . # (if (g <h)) Less: A branch if $t0 != 0 , branches if g < h . � Register $zero is always 0, so use bne comparing register $t0 to register $zero � How to test if (g >= h)? 25 Set Less Than Immediate in C / Assembly � Also immediate version of slt to test against constants: slti � Helpful in for loops C if ( g >= 1) go to Loop Loop: . . . M slti $t0,$s0,1 # $t0 = 1 if I # $s0 < 1 (g < 1) beq $t0,$zero,Loop # goto Loop P # if $t0 == 0 S # ( if ( g >= 1 )) 26 C case / switch statement � Choose among four alternatives depending on � whether k has the value 0, 1, 2, or 3 switch (k) { case 0: f=i+j; break; /* k=0*/ case 1: f=g+h; break; /* k=1*/ case 2: f=g–h; break; /* k=2*/ case 3: f=i–j; break; /* k=3*/ } 27 9

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend