Spring 2002INEL 4206 Microprocessors Lecture 5 1 Programming Universal Computers Instruction Sets Prof. Bienvenido Velez Lecture 5
Spring 2002INEL 4206 Microprocessors Lecture 5 2 What do we know? Instruction Set Architecture Processor Implementation From To How do we get here in the first place? What Next? Instruction Set Design
Spring 2002INEL 4206 Microprocessors Lecture 5 3 Outline Virtual Machines: Interpretation Revisited Example: From HLL to Machine Code Implementing HLL Abstractions –Control structures –Data Structures –Procedures and Functions
Spring 2002INEL 4206 Microprocessors Lecture 5 4 Virtual Machines (VM’s) Type of Virtual Machine ExamplesInstruction Elements Data ElementsComments Application Programs Spreadsheet, Word Processor Drag & Drop, GUI ops, macros cells, paragraphs, sections Visual, Graphical, Interactive Application Specific Abstractions Easy for Humans Hides HLL Level High-Level Language C, C++, Java, FORTRAN, Pascal if-then-else, procedures, loops arrays, structuresModular, Structured, Model Human Language/Thought General Purpose Abstractions Hides Lower Levels Assembly- Level SPIM, MASMdirectives, pseudo- instructions, macros registers, labelled memory cells Symbolic Instructions/Data Hides some machine details like alignment, address calculations Exposes Machine ISA Machine-Level (ISA) MIPS, Intel 80x86 load, store, add, branch bits, binary addresses Numeric, Binary Difficult for Humans
Spring 2002INEL 4206 Microprocessors Lecture 5 5 Computer Science in Perspective Application Programs High-Level Language Assembly Language Machine Language (ISA) CS1/CS2, Programming, Data Structures Programming Languages, Compilers Computer Architecture Computer Human Interaction, User Interfaces People computers INTERPRETATION A CORE theme all throughout Computer Science INEL 4206
Spring 2002INEL 4206 Microprocessors Lecture 5 6 Computing Integer Division Iterative C++ Version int a = 12; int b = 4; int result = 0; main () { if (a >= b) { while (a > 0) { a = a - b; result ++; } We ignore procedures and I/O for now
Spring 2002INEL 4206 Microprocessors Lecture 5 7 Symbolic Name OpcodeAction I=0 Symbolic Name Action I=1 Comp AC ← not ACCompAC <- not AC ShR AC ← AC / 2ShRAC ← AC / 2 BrN AC < 0 ⇒ PC ← XBrNAC < 0 ⇒ PC ← MEM[X] Jump PC ← XJumpPC ← MEM[X] Store MEM[X] ← ACStoreMEM[MEM[X]] ← AC Load AC ← MEM[X]LoadAC ← MEM[MEM[X]] Andc AC ← AC and XAndAC ← AC and MEM[X] Addc AC ← AC + XAddAC ← AC + MEM[X] Easy I A Simple Accumulator Processor Instruction Set Architecture (ISA) Instruction Set
Spring 2002INEL 4206 Microprocessors Lecture 5 8 Computing Integer Division Iterative C++ Version int a = 12; int b = 4; int result = 0; main () { if (a >= b) { while (a > 0) { a = a - b; result ++; } Easy-I Assembly Language C++
Spring 2002INEL 4206 Microprocessors Lecture 5 9 0:andc 0# AC = 0 addc 12 store 1000# a = 12 (a 1000) andc 0# AC = 0 addc 4 store 1004# b = 4 (b 1004) andc 0# AC = 0 store 1008# result = ) Computing Integer Division Iterative C++ Version int a = 12; int b = 4; int result = 0; main () { if (a >= b) { while (a > 0) { a = a - b; result ++; } Translate Data: Global Layout Easy-I Assembly Language C++ Issues Memory allocation Data Alignment Data Sizing
Spring 2002INEL 4206 Microprocessors Lecture 5 10 Computing Integer Division Iterative C++ Version int a = 12; int b = 4; int result = 0; main () { if (a >= b) { while (a > 0) { a = a - b; result ++; } Translate Code: Conditionals If-Then 0:andc 0# AC = 0 addc 12 store 1000# a = 12 (a 1000) andc 0# AC = 0 addc 4 store 1004# b = 4 (b 1004) andc 0# AC = 0 store 1008# result = ) main:load 1004# compute a – b in AC comp# using 2’s complement add addc 1 add 1000 brn exit# exit if AC negative exit: Easy-I Assembly Language C++ Issues Must translate HLL boolean expression into ISA-level branching condition
Spring 2002INEL 4206 Microprocessors Lecture 5 11 Computing Integer Division Iterative C++ Version int a = 12; int b = 4; int result = 0; main () { if (a >= b) { while (a > 0) { a = a - b; result ++; } Translate Code: Iteration (loops) 0:andc 0# AC = 0 addc 12 store 1000# a = 12 (a 1000) andc 0# AC = 0 addc 4 store 1004# b = 4 (b 1004) andc 0# AC = 0 store 1008# result = ) main:load 1004# compute a – b in AC comp# using 2’s complement add addc 1 add 1000 brn exit# exit if AC negative loop:load 1000 brn endloop jump loop endloop: exit: Easy-I Assembly Language C++
Spring 2002INEL 4206 Microprocessors Lecture 5 12 Computing Integer Division Iterative C++ Version int a = 12; int b = 4; int result = 0; main () { if (a >= b) { while (a > 0) { a = a - b; result ++; } Translate Code: Arithmetic Ops 0:andc 0# AC = 0 addc 12 store 1000# a = 12 (a 1000) andc 0# AC = 0 addc 4 store 1004# b = 4 (b 1004) andc 0# AC = 0 store 1008# result = ) main:load 1004# compute a – b in AC comp# using 2’s complement add addc 1 add 1000 brn exit# exit if AC negative loop:load 1000 brn endloop load 1004 comp add 1004# Uses indirect bit I = 1 jump loop endloop: exit: Easy-I Assembly Language C++
Spring 2002INEL 4206 Microprocessors Lecture 5 13 Computing Integer Division Iterative C++ Version int a = 12; int b = 4; int result = 0; main () { if (a >= b) { while (a > 0) { a = a - b; result ++; } Translate Code: Assignments 0:andc 0# AC = 0 addc 12 store 1000# a = 12 (a 1000) andc 0# AC = 0 addc 4 store 1004# b = 4 (b 1004) andc 0# AC = 0 store 1008# result = ) main:load 1004# compute a – b in AC comp# using 2’s complement add addc 1 add 1000 brn exit# exit if AC negative loop:load 1000 brn endloop load 1004 comp add 1004# Uses indirect bit I = 1 store 1000 jump loop endloop: exit: Easy-I Assembly Language C++
Spring 2002INEL 4206 Microprocessors Lecture 5 14 Computing Integer Division Iterative C++ Version int a = 12; int b = 4; int result = 0; main () { if (a >= b) { while (a > 0) { a = a - b; result ++; } Translate Code: Increments 0:andc 0# AC = 0 addc 12 store 1000# a = 12 (a 1000) andc 0# AC = 0 addc 4 store 1004# b = 4 (b 1004) andc 0# AC = 0 store 1008# result = ) main:load 1004# compute a – b in AC comp# using 2’s complement add addc 1 add 1000 brn exit# exit if AC negative loop:load 1000 brn endloop load 1004 comp add 1004# Uses indirect bit I = 1 store 1000 load 1012# result = result + 1 addc 1 store 1012 jump loop endloop: exit: Easy-I Assembly Language C++
Spring 2002INEL 4206 Microprocessors Lecture 5 15 Computing Integer Division Easy I Machine Code AddressI BitOpcode (binary) X (base 10) unused unused AddressContents 1000a 1004b 1008result Data Program Challenge Make this program as small and fast as possible
Spring 2002INEL 4206 Microprocessors Lecture 5 16 The MIPS Architecture ISA at a Glance Reduced Instruction Set Computer (RISC) 32 general purpose 32-bit registers Load-store architecture: Operands in registers Byte Addressable 32-bit address space
Spring 2002INEL 4206 Microprocessors Lecture 5 17 Simple and uniform 32-bit 3-operand instruction formats –R Format: Arithmetic/Logic operations on registers –I Format: Branches, loads and stores The MIPS Architecture Instruction Formats opcode 6 bits rs 5 bits rt 5 bits rd 5 bits shamt 5 bits funct 6 bits opcode 6 bits rs 5 bits rt 5 bits address 16 bits
Spring 2002INEL 4206 Microprocessors Lecture 5 18 The MIPS Architecture Memory Usage
Spring 2002INEL 4206 Microprocessors Lecture 5 19 SPIM Assembler Help Symbolic Labels Assembler Directives Pseudo-Instructions Macros
Spring 2002INEL 4206 Microprocessors Lecture 5 20 Computing Integer Division Iterative C++ Version int a = 12; int b = 4; int result = 0; main () { while (a >= b) { a = a - b; result ++; } Global Variable Layout MIPS Assembly Language C++.data# Use HLL program as a comment x:.word12# int x = 12; y:.word4# int y = 4; res:.word0# int res = 0;.globlmain.text main:la$s0, x# Allocate registers for globals lw$s1, 0($s0)# x in $s1 lw$s2, 4($s0)# y in $s2 lw$s3, 8($s0)# res in $s3 while:bgt$s2, $s1, endwhile# while (x <= y) { sub$s1, $s1, $s2# x = x - y; addi$s3, $s3, 1# res ++; jwhile# } endwhile: la$s0, x# Update variables in memory sw$s1, 0($s0) sw$s2, 4($s0) sw$s3, 8($s0) jr$ra
Spring 2002INEL 4206 Microprocessors Lecture 5 21 Implementing Procedures Why procedures? –Abstraction –Modularity –Code re-use Initial Goal –Write segments of assembly code that can be re-used, or “called” from different points in the program. –KISS: no parameters, no recursion, no locals, no return values
Spring 2002INEL 4206 Microprocessors Lecture 5 22 Procedure Linkage Approach I Problem –procedure must determine where to return after servicing the call Solution –Add a jump instruction that saves the return address in some place known to callee MIPS: jal instruction saves return address in register $ra –Add an instruction that can jump to an address contained in a register MIPS: jr instruction jumps to the address contained in its argument register
Spring 2002INEL 4206 Microprocessors Lecture 5 23 Computing Integer Division (Procedure Version) Iterative C++ Version int a = 0; int b = 0; int result = 0; main () { a = 12; b = 5; res = 0; div(); printf(“Res = %d”,res); } void div(void) { while (a >= b) { a = a - b; result ++; } MIPS Assembly Language C++ # main function (Up to now, we have ignored that main is indeed a function #PENDING ISSUES: main must save $ra before calling other functions main:int main() { # main assumes registers sx unused li$s1, 12# x = 12; usw$s1, x li$s2, 5# y = 5; usw$s2, y li$s3, 0# res = 0; usw$s3, res jald# div(); la$a0, pf1# printf("Result = %d \n"); li$v0, 4# //system call to print_str syscall move$a0, $s3 li$v0, 1# //system call to print_int syscall la$a0, pf2# printf("Remainder = %d \n"); li$v0, 4# //system call to print_str syscall move$a0, $s1 li$v0, 1# //system call to print_int syscall jr$ra# return; # } # div function # PROBLEM: Must save args and registers before using them d:# void d(void) { # Allocate registers for globals ulw$s1, x# x in $s1 ulw$s2, y# y in $s2 ulw$s3, res# result in $s3 while:bgt$s2, $s1, endwhile# while (x <= y) { sub$s1, $s1, $s2# x = x - y addi$s3, $s3, 1# res ++ jwhile# } endwhile:# Update variables in memory usw$s1, x usw$s2, y usw$s3, res enddiv:jr$ra# return; # }
Spring 2002INEL 4206 Microprocessors Lecture 5 24 Pending Problems With Linkage Approach I Registers must be shared by all procedures Procedures should be able to call other procedures Lack of parameters forces access to globals Recursion requires multiple copies of local data Need a convention for returning function values
Spring 2002INEL 4206 Microprocessors Lecture 5 25 Solution: Use Stacks of Procedure Frames Stack frame contains: –Saved arguments –Saved registers –Return address –Local variables main stack frame div stack frame OS stack growth
Spring 2002INEL 4206 Microprocessors Lecture 5 26 Anatomy of a Stack Frame function arguments saved registers return address Contract: Every function must leave the stack the way it found it local variables of static size caller’s stack frame work area frame pointer stack pointer
Spring 2002INEL 4206 Microprocessors Lecture 5 27 Example: Function Linkage using Stack Frames int x = 0; int y = 0; int res = 0; main () { x = 12; y = 5; res = div(x,y); printf(“Res = %d”,res); } int div(int a,int b) { int res = 0; if (a >= b) { res = div(a-b,b) + 1; } else { res = 0; } return res; } Add return values Add parameters Add recursion Add local variables
Spring 2002INEL 4206 Microprocessors Lecture 5 28 MIPS: Procedure Linkage Summary First 4 arguments passed in $a0-$a3 Other arguments passed on the stack Return address passed in $ra Return value(s) returned in $v0-$v1 Sx registers saved by callee Tx registers saved by caller