Programming Universal Computers Instruction Sets
description
Transcript of Programming Universal Computers Instruction Sets
Spring 2002 INEL 4206 Microprocessors Lecture 5
1
Programming Universal Computers
Instruction Sets
Prof. Bienvenido Velez
Lecture 5
Spring 2002 INEL 4206 Microprocessors Lecture 5
2
What do we know?
Instruction SetArchitecture
ProcessorImplementation
From To
How do we get herein the first place?
What Next?Instruction Set
Design
Spring 2002 INEL 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 2002 INEL 4206 Microprocessors Lecture 5
4
Virtual Machines (VM’s) Type of Virtual
Machine
Examples Instruction Elements
Data Elements Comments
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, structures Modular, Structured, Model Human Language/Thought
General Purpose Abstractions
Hides Lower Levels
Assembly-Level
SPIM, MASM directives, 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 2002 INEL 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
People computers
INTERPRETATIONA CORE theme all throughout
Computer Science
INEL
4206
Spring 2002 INEL 4206 Microprocessors Lecture 5
6
Computing Integer Division
Iterative C++ Versionint 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 2002 INEL 4206 Microprocessors Lecture 5
7
Symbolic
Name
Opcode ActionI=0
Symbolic
Name
ActionI=1
Comp 00 000 AC ← not AC Comp AC <- not AC
ShR 00 001 AC ← AC / 2 ShR AC ← AC / 2
BrN 00 010 AC < 0 ⇒ PC ← X BrN AC < 0 ⇒ PC ← MEM[X]
Jump 00 011 PC ← X Jump PC ← MEM[X]
Store 00 100 MEM[X] ← AC Store MEM[MEM[X]] ← AC
Load 00 101 AC ← MEM[X] Load AC ← MEM[MEM[X]]
Andc 00 110 AC ← AC and X And AC ← AC and MEM[X]
Addc 00 111 AC ← AC + X Add AC ← AC + MEM[X]
Easy IA Simple Accumulator Processor
Instruction Set Architecture (ISA)
Instruction Set
Spring 2002 INEL 4206 Microprocessors Lecture 5
8
Computing Integer DivisionIterative 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 2002 INEL 4206 Microprocessors Lecture 5
9
0: andc 0 # AC = 0addc 12store 1000 # a = 12 (a stored @ 1000)andc 0 # AC = 0addc 4store 1004 # b = 4 (b stored @ 1004) andc 0 # AC = 0store 1008 # result = 0 (result @ 1008)
Computing Integer DivisionIterative 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 2002 INEL 4206 Microprocessors Lecture 5
10
Computing Integer DivisionIterative 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 = 0addc 12store 1000 # a = 12 (a stored @ 1000)andc 0 # AC = 0addc 4store 1004 # b = 4 (b stored @ 1004) andc 0 # AC = 0store 1008 # result = 0 (result @ 1008)
main: load 1004 # compute a – b in ACcomp # using 2’s complement addaddc 1add 1000brn exit # exit if AC negative
exit:
Easy-I Assembly Language
C++
Issues•Must translate HLL boolean
expression into ISA-level branching condition
Spring 2002 INEL 4206 Microprocessors Lecture 5
11
Computing Integer DivisionIterative 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 = 0addc 12store 1000 # a = 12 (a stored @ 1000)andc 0 # AC = 0addc 4store 1004 # b = 4 (b stored @ 1004) andc 0 # AC = 0store 1008 # result = 0 (result @ 1008)
main: load 1004 # compute a – b in ACcomp # using 2’s complement addaddc 1add 1000brn exit # exit if AC negative
loop: load 1000brn endloop
jump loopendloop:exit:
Easy-I Assembly Language
C++
Spring 2002 INEL 4206 Microprocessors Lecture 5
12
Computing Integer DivisionIterative 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 = 0addc 12store 1000 # a = 12 (a stored @ 1000)andc 0 # AC = 0addc 4store 1004 # b = 4 (b stored @ 1004) andc 0 # AC = 0store 1008 # result = 0 (result @ 1008)
main: load 1004 # compute a – b in ACcomp # using 2’s complement addaddc 1add 1000brn exit # exit if AC negative
loop: load 1000brn endloopload 1004compadd 1004 # Uses indirect bit I = 1
jump loopendloop:exit:
Easy-I Assembly Language
C++
Spring 2002 INEL 4206 Microprocessors Lecture 5
13
Computing Integer DivisionIterative 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 = 0addc 12store 1000 # a = 12 (a stored @ 1000)andc 0 # AC = 0addc 4store 1004 # b = 4 (b stored @ 1004) andc 0 # AC = 0store 1008 # result = 0 (result @ 1008)
main: load 1004 # compute a – b in ACcomp # using 2’s complement addaddc 1add 1000brn exit # exit if AC negative
loop: load 1000brn endloopload 1004compadd 1004 # Uses indirect bit I = 1store 1000
jump loopendloop:exit:
Easy-I Assembly Language
C++
Spring 2002 INEL 4206 Microprocessors Lecture 5
14
Computing Integer DivisionIterative 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 = 0addc 12store 1000 # a = 12 (a stored @ 1000)andc 0 # AC = 0addc 4store 1004 # b = 4 (b stored @ 1004) andc 0 # AC = 0store 1008 # result = 0 (result @ 1008)
main: load 1004 # compute a – b in ACcomp # using 2’s complement addaddc 1add 1000brn exit # exit if AC negative
loop: load 1000brn endloopload 1004compadd 1004 # Uses indirect bit I = 1store 1000load 1012 # result = result + 1addc 1store 1012jump loop
endloop:exit:
Easy-I Assembly Language
C++
Spring 2002 INEL 4206 Microprocessors Lecture 5
15
Computing Integer Division Easy I
Machine Code
Address I Bit Opcode
(binary)
X
(base 10)
0 0 00 110 0
2 0 00 111 12
4 0 00 100 1000
6 0 00 110 0
8 0 00 111 4
10 0 00 100 1004
12 0 00 110 0
14 0 00 100 1008
16 0 00 101 1004
18 0 00 000 unused
20 0 00 111 1
22 1 00 111 1004
24 0 00 010 44
26 0 00 101 1000
28 0 00 010 44
30 0 00 101 1004
32 0 00 000 unused
34 1 00 111 1004
36 0 00 100 1008
38 0 00 101 1012
40 0 00 111 1
42 0 00 101 1000
44 0 00 011 26
Address Contents
1000 a
1004 b
1008 result
DataProgram
ChallengeMake this program as
small and fast as possible
Spring 2002 INEL 4206 Microprocessors Lecture 5
16
The MIPS ArchitectureISA 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 2002 INEL 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 ArchitectureInstruction Formats
opcode6 bits
rs5 bits
rt5 bits
rd5 bits
shamt5 bits
funct6 bits
opcode6 bits
rs5 bits
rt5 bits
address16 bits
Spring 2002 INEL 4206 Microprocessors Lecture 5
18
The MIPS ArchitectureMemory Usage
Spring 2002 INEL 4206 Microprocessors Lecture 5
19
SPIM Assembler Help
• Symbolic Labels
• Assembler Directives
• Pseudo-Instructions
• Macros
Spring 2002 INEL 4206 Microprocessors Lecture 5
20
Computing Integer DivisionIterative 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: .word 12 # int x = 12;
y: .word 4 # int y = 4;
res: .word 0 # int res = 0;
.globl main
.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 ++;
j while # }
endwhile:
la $s0, x # Update variables in memory
sw $s1, 0($s0)
sw $s2, 4($s0)
sw $s3, 8($s0)
jr $ra
Spring 2002 INEL 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 2002 INEL 4206 Microprocessors Lecture 5
22
Procedure LinkageApproach 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 2002 INEL 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 functionsmain: int main() {
# main assumes registers sx unusedli $s1, 12 # x = 12; usw $s1, xli $s2, 5 # y = 5; usw $s2, yli $s3, 0 # res = 0; usw $s3, resjal d # div();la $a0, pf1 # printf("Result = %d \n");li $v0, 4 # //system call to print_strsyscallmove $a0, $s3li $v0, 1 # //system call to print_intsyscallla $a0, pf2 # printf("Remainder = %d \n");li $v0, 4 # //system call to print_strsyscallmove $a0, $s1li $v0, 1 # //system call to print_intsyscalljr $ra # return;
# }# div function# PROBLEM: Must save args and registers before using themd: # void d(void) {
# Allocate registers for globalsulw $s1, x # x in $s1ulw $s2, y # y in $s2ulw $s3, res # result in $s3
while: bgt $s2, $s1, endwhile # while (x <= y) {sub $s1, $s1, $s2 # x = x - yaddi $s3, $s3, 1 # res ++j while # }
endwhile: # Update variables in memoryusw $s1, xusw $s2, yusw $s3, res
enddiv: jr $ra # return;# }
Spring 2002 INEL 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 2002 INEL 4206 Microprocessors Lecture 5
25
Solution: Use Stacks of Procedure Frames
• Stack frame contains:– Saved arguments– Saved registers– Return address– Local variables
mainstack frame
divstack frame
OS
stack growth
Spring 2002 INEL 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
framepointer
stackpointer
Spring 2002 INEL 4206 Microprocessors Lecture 5
27
Example: Function Linkage using Stack
Framesint 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 2002 INEL 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