Programming Universal Computers Instruction Sets
description
Transcript of Programming Universal Computers Instruction Sets
![Page 1: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/1.jpg)
Spring 2002 INEL 4206 Microprocessors Lecture 5
1
Programming Universal Computers
Instruction Sets
Prof. Bienvenido Velez
Lecture 5
![Page 2: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/2.jpg)
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
![Page 3: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/3.jpg)
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
![Page 4: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/4.jpg)
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
![Page 5: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/5.jpg)
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
![Page 6: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/6.jpg)
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
![Page 7: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/7.jpg)
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
![Page 8: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/8.jpg)
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++
![Page 9: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/9.jpg)
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
![Page 10: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/10.jpg)
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
![Page 11: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/11.jpg)
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++
![Page 12: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/12.jpg)
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++
![Page 13: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/13.jpg)
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++
![Page 14: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/14.jpg)
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++
![Page 15: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/15.jpg)
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
![Page 16: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/16.jpg)
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
![Page 17: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/17.jpg)
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
![Page 18: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/18.jpg)
Spring 2002 INEL 4206 Microprocessors Lecture 5
18
The MIPS ArchitectureMemory Usage
![Page 19: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/19.jpg)
Spring 2002 INEL 4206 Microprocessors Lecture 5
19
SPIM Assembler Help
• Symbolic Labels
• Assembler Directives
• Pseudo-Instructions
• Macros
![Page 20: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/20.jpg)
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
![Page 21: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/21.jpg)
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
![Page 22: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/22.jpg)
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
![Page 23: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/23.jpg)
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;# }
![Page 24: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/24.jpg)
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
![Page 25: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/25.jpg)
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
![Page 26: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/26.jpg)
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
![Page 27: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/27.jpg)
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
![Page 28: Programming Universal Computers Instruction Sets](https://reader034.fdocuments.net/reader034/viewer/2022051517/568157f2550346895dc56be3/html5/thumbnails/28.jpg)
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