View
6
Download
0
Category
Preview:
Citation preview
10.1
EE 109 Unit 10 – MIPS
Instruction Set
10.2
MIPS INSTRUCTION OVERVIEW
10.3
Instruction Set Architecture (ISA)
• Defines the _________________ of the processor and memory system
• Instruction set is the ____________ the HW can understand and the SW is composed with
• 2 approaches
– _____ = ___________ instruction set computer
• Large, rich vocabulary
• More work per instruction but slower HW
– _____ = ___________ instruction set computer
• Small, basic, but sufficient vocabulary
• Less work per instruction but faster HW
10.4
MIPS Processor and Bus Interface
• The MIPS processor can execute software instructions that will cause it to:
– Load (Read) and Store (Write) data to and from memory or I/O devices
– Perform arithmetic and logic operations (add, sub, and, etc.)
– Make decisions to move around in the code (loops, ifs, call a function, etc.)
MIPS Processor
Addr (32-bits)
Data (32-bits)
Control
Memory
instruc
data
0
ALUADD, SUB, AND, OR
op.
in1
in2
out
PC
$0-$31(32-bits each)
(32-bits ALU)
10.5
Which Instructions
• In this class we'll focus on assembly to do the following tasks (shown with the corresponding MIPS assembly
mnemonics)
– Load variables (data) from memory (or I/O) [LW,LH,LB]
– Perform arithmetic, logical, and shift instructions in the CPU [ADD,SUB,AND,OR,SLL,SRL,SRA]
– Store variables (data) back to memory after computation is complete [SW, SH, SB]
– Compare data [SLT]
– "Branch" to other code (to implement if and loops) [BEQ,BNE,J]
– Call subroutines/functions [JAL, JR]
10.6
MIPS Instruction Set
• __________-style
• ______________ internal / __________ external data size– Registers and ALU are 32-bits wide
– Memory bus is logically 32-bits wide (though may be physically wider)
• Registers– ______ General Purpose Registers (GPR’s)
• For integer and address values
• A few are used for specific tasks/values
• Fixed size instructions – All instructions encoded as a single ______-bit word
– Three operand instruction format (dest, src1, src2)
– Load/store architecture (all data operands must be in registers and thus loaded from and stored to memory explicitly)
10.7
MIPS GPR’sAssembler Name Reg. Number Description
$zero $0 Constant 0 value
$at $1 Assembler temporary
$v0-$v1 $2-$3 Procedure return values or expression
evaluation
$a0-$a3 $4-$7 Arguments/parameters
$t0-$t7 $8-$15 Temporaries
$s0-$s7 $16-$23 Saved Temporaries
$t8-$t9 $24-$25 Temporaries
$k0-$k1 $26-$27 Reserved for OS kernel
$gp $28 Global Pointer (Global and static
variables/data)
$sp $29 Stack Pointer
$fp $30 Frame Pointer
$ra $31 Return address for current procedure
Avoid using the yellow (highlighted) registers for anything other than its stated use
10.8
MIPS Programmer-Visible Registers
• General Purpose Registers (GPR’s)– Hold data operands or
addresses (pointers) to data stored in memory
• Special Purpose Registers– ___: ____________ ___(32-bits)
• Holds the address of the next instruction to be fetched from memory & executed
– HI: Hi-Half Reg. (32-bits)• For MUL, holds 32 MSB’s of
result. For DIV, holds 32-bit remainder
– LO: Lo-Half Reg. (32-bits)• For MUL, holds 32 LSB’s of
result. For DIV, holds 32-bit quotient MIPS Core
PC:
$0 - $31
32-bits
GPR’s
Special Purpose Registers
HI:
LO:
Recall multiplying two 32-bit numbers yields a 64-bit result
10.9
IMPORTANT R-TYPE INSTRUCTIONS
Performing Arithmetic, Logic, and Shift Operations
10.10
R-Type Arithmetic/Logic InstructionsC operator Assembly Notes
+ ADD $d, $s, $t d=destination, s = src1, t = src2
- SUB $d, $s, $t Order: $s – $t. SUBU for unsigned
* MUL $d, $s, $t If multiply won’t overflow 32-bit result
& AND $d, $s, $t
| OR $d, $s, $t
^ XO$ $d, $s, $t
~( | ) NOR $d, $s, $t Can be used for bitwise-NOT (~)
> (signed) SRA $d, $s, shamtSRAV $d, $s, $t
Shifts $s right by shamt or $t bits replicating sign bit to maintain sign
>> (unsigned) SRL $d, $s, shamtSRLV $d, $s, $t
Shifts $s left by shamt or $t bits shifting in 0’s
, = SLT $d, $s, $tSLTU $d, $s, $t
Comparison. Order: $s – $t. Sets $d=1 if $s < $t, $d=0 otherwise
* MULT $s, $t MULTU $s, $t
Result in HI/LO. Use mfhi and mfloinstruction to move results
/ DIV $s, $tDIVU $s, $t
$[s] / $[t]. Remainder in HI, quotient in LO
10.11
R-Type Instructions
C Code MIPS Assembly
F = X + Y – Z;
G = F | Z;
LOAD* $4, X # Get X from mem.
LOAD _____ # Get Y from mem.
LOAD _____ # Get Z from mem.
ADD _______ # Tmp = X+Y
SUB _______ # Tmp = Tmp - Z
STORE _______ # Store to F in memOR _______ # Tmp2 = F | Z
STORE $8, G # Store to G in mem* LOAD/STORE are not actual instructions. We will learn the actual syntax soon.
• To perform arithmetic or logic operations in many processors (MIPS included) a copy of the operand MUST be loaded into a register first
• Consider the following operations– F = X + Y – Z– G = F | Z
• Complete the assembly codeto perform these operations
– Remember to load/store youroperands to/from registers
MIPS Processor
Addr (32-bits)
Data (32-bits)
Control
Mem
ory
Load00400000
ALUADD, SUB, AND, OR
op.
in1
in2
out
PC
$0-$31(32-bits each)
(32-bits ALU)
Load
…
Store
X (e.g. 12)
Y (e.g. 7)
Z (e.g. 3)
F
G
$4
$5
$6
$7
$8
00400004
10010000
10010004
10.12
R-Type Instructions
• Format
– rs, rt, rd are 5-bit fields for register numbers
– shamt = shift amount and is used for shift instructions indicating # of places to shift bits
– opcode and func identify actual operation (e.g. ADD, SUB)
• Example:
– ADD $5, $24, $17
opcode rs (src1)
6-bits 5-bits
rt (src2)
5-bits
rd (dest)
5-bits
shamt
5-bits
function
6-bits
000000
opcode rs rt rd
00000
shamt
100000
func
Arith. Inst. $24 $17 $5 unused ADD
10.13
Logical Operations
• Should already be familiar with (sick of) these! ☺☺☺☺
• Logic operations are usually performed on a pair of bits
AND – Output is true if both inputs are true
OR – Output is true if any input is true
XOR – Output is true if exactly oneinput is true
X1 X2 AND
0 0 0
0 1 0
1 0 0
1 1 1
X1 X2 OR
0 0 0
0 1 1
1 0 1
1 1 1
X1 X2 XOR
0 0 0
0 1 1
1 0 1
1 1 0
X1 NOT
0 1
1 0
NOT – Output is inverse of input
0 OR x = x1 OR x = 1x OR x = x
0 AND x = 01 AND x = xx AND x = x
0 XOR x = x1 XOR x = NOT xx XOR x = 0
10.14
Logical Operations
• Logic operations on numbers means performing the operation on each pair of bits
Initial Conditions: $1 = 0xF0, $2 = 0x3C
AND $2,$1,$2
R[2] = 0x30
0xF0AND 0x3C
0x30
1111 0000AND 0011 1100
0011 0000
OR $2,$1,$2
R[2] = 0xFC
0xF0OR 0x3C
0xFC
1111 0000OR 0011 1100
1111 1100
XOR $2,$1,$2
R[2] = 0xCC
0xF0XOR 0x3C
0xCC
1111 0000XOR 0011 1100
1100 1100
1
2
3
Tip: Unless you're very good w/ hex, convert to binary then perform these operations!
10.15
Logical Operations
• Logic operations on numbers means performing the operation on each pair of bits
Initial Conditions: $1= 0xF0, $2 = 0x3C
NOR $2,$1,$2
R[2] = 0x03
0xF0NOR 0x3C
0x03
1111 0000NOR 0011 1100
0000 0011
4
NOR $2,$1,$1
R[2] = 0x0F
0xF0NOR 0xF0
0x0F
1111 0000NOR 1111 0000
0000 1111
Bitwise NOT operation can be performed by NOR’ing
register with itself
10.16
Shift Operations• Shifts data bits either left or right
– Bits shifted out and dropped on one side
– Usually (but not always) 0’s are shifted in on the other side
• In addition to just moving bits around, shifting is a fast way to multiply or divide a number by ____________(see next slides)
• 2 kinds of shifts
– Logical shifts (used for __________________ numbers)
– Arithmetic shifts (used for _________________ numbers)
0 0 0 0 0 0 1 1
Right Shift by 2 bits:
Original Data
Shifted by 2 bits
0 0 0 0 1 1 0 0
0 0 0 0 1 0 1 0 0 0
Left Shift by 2 bits:
Original Data
Shifted by 2 bits
0 0 0 0 1 0 1 0
0 00’s shifted in… 0’s shifted in…
10.17
Logical Shift
• 0’s shifted in
• Only use for operations on unsigned data– Right shift by n-bits = Dividing by 2n
– Left shift by n-bits = Multiplying by 2n
Logical Right Shift by 2 bits:
... _____________
Logical Left Shift by 3 bits:
0’s shifted in… 0’s shifted in…
0 ... 0 1 1 0 0 = +12
= +3 = +96
0 x 0 0 0 0 0 0 0 C
0 x 0 0 0 0 0 0 0 3 0 x 0 0 0 0 0 0 6 0
10.18
Arithmetic Shift
• Use for operations on signed data• Arithmetic Right Shift – replicate MSB
– Right shift by n-bits = Dividing by 2n
• Arithmetic Left Shift – shifts in 0’s– Left shift by n-bits = Multiplying by 2n
_ _ 1 ... 1 1 1
Arithmetic Right Shift by 2 bits:
1 ... 1 0 0 0 0
Arithmetic Left Shift by 2 bits:
MSB replicated and shifted in… 0’s shifted in…
1 1 ... 1 1 0 0 = -4
= -1 = -16
Notice if we shifted in 0’s (like a logical right shift) our result would
be a positive number and the division wouldn’t work
0 x F F F F F F F C
0 x _ _ _ _ _ _ _ _Notice there is no difference between
an arithmetic and logical left shift. We always shift in 0’s.
0 x _ _ _ _ _ _ _ _ _
10.19
Logical Shift vs. Arithmetic Shift
• Logical Shift– Use for unsigned or non-
numeric data
– Will always shift in ______ whether it be a left or right shift
• Arithmetic Shift– Use for signed data
– Left shift will shift in ____
– Right shift will ____________ (__________ the sign bit) rather than shift in 0’s
• If negative number…stays negative by shifting in _____
• If positive…stays positive by shifting in ______
Right shift
Left shift
Right shift
Left shift
__
__
___
10.20
MIPS Logical Shift Instructions
• SRL instruction – Shift Right Logical• SLL instruction – Shift Left Logical• Format:
– SxL rd, rt, shamt (shamt = shift amount and is a constant; e.g. x
10.21
MIPS Arithmetic Shift Instruction
• SRA instruction – Shift Right Arithmetic• No arithmetic left shift (use SLL for arithmetic left shift)• Format:
– SRA rd, rt, shamt (shamt = shift amount and is a constant; e.g. x >> 7)– SRAV rd, rt, rs (rs is the shift amount and is variable; e.g. x >> y)
• Notes:– shamt limited to a 5-bit value (0-31)– SRAV shifts data in rt by number of places specified in rs
• Examples– SRA $5, $12, 7– SRAV $5, $12, $20
000000 00000
opcode rs
01100
rt
00101
rd
00111
shamt
000011
func
Arith. Inst. unused $12 $5 7 SRA
000000 10100 01100 00101 00000 000111
Arith. Inst. $20 $12 $5 unused SRAV
10.22
Immediate Operands
• Most ALU instructions also have an immediate form to be used when one operand is a constant value
• Syntax: ADDI Rs, Rt, imm
– Because immediates are limited to 16-bits, they must be extended to a full 32-bits when used the by the processor
– ___________ instructions always sign-extend to a full 32-bits even for unsigned instructions (addiu)
– ___________ instructions always zero-extend to a full 32-bits
• Examples:
– ADDI $4, $5, -1 // R[4] = R[5] + 0xFFFFFFFF
– ORI $10, $14, -4 // R[10] = R[14] | 0x0000FFFC
Arithmetic Logical
ADDI ANDI
SLTI ORI
XORI
Note: SUBI is unnecessary since we can use ADDI with a negative immediate value
10.23
Set If Less-Than
• SLT $rd, $rs, $rt
– Compares $rs value with $rt value and stores Boolean (1 = true, 0 = false) value
into $rd
– C code equivalent: _________________
– $rd can only be 0x0000001 or 0x00000000 after execution
– Assumes signed integer comparison
• SLTI $rd, $rs, immediate
– Same as above but now 2nd source is a constant
• SLTU $rd, $rs, $rt
– Same as SLT but interprets values as unsigned
SLT $4, $1, $2$4 = 0x0000000_
Initial Conditions:
$1= 0xffffffff, $2 = 0x00000000$3 = 0x000000ff
SLT $4, $3, $3$4 = 0x0000000_
SLT $4, $3, $1$4 = 0x0000000_
SLTI $4, $2, 35$4 = 0x0000000_
SLTU $4, $1, $2$4 = 0x0000000_
10.24
DATA TRANSFER AND MEMORY
ACCESS INSTRUCTIONS
Loading (Reading) and Storing (Writing) Data From and To Memory
10.25
Physical Memory Organization
• Physical view of memory as large 2-D array of bytes (8K rows by 1KB columns) per chip (and several chips)
• Address is broken into fields of bits that are used to identify where in the array the desired 32-bit word is
– Processor always accesses memory chunks the size of the data bus, selecting only the desired bytes as specified by the instruction
...
…
Physical View of Memory
...
Proc.
32
32
A
D
Rank/Bank Row Col
Sample Address Breakdown
...
...
XX
0x00000404
00000 0000000000001 00000001 000x0404 =
0x000000
0x000400
0x000800
Assume each unit is a word
10.26
MIPS Supported Data Sizes
Integer
• 3 Sizes Defined
– Byte (B)
• 8-bits
– Halfword (H)
• 16-bits = 2 bytes
– Word (W)
• 32-bits = 4 bytes
Floating Point
• 3 Sizes Defined
– Single (S)
• 32-bits = 4 bytes
– Double (D)
• 64-bits = 8 bytes
• (For a 32-bit data bus, a double would be accessed
from memory in 2 reads)
10.27
MIPS Memory Organization• We can logically picture
memory in the units (sizes) that we actually access them
• Most processors are __________________________
– Every byte (8-bits) has a unique address
– 32-bit address bus => 4 GB address space
• However, 32-bit logical data bus allows us to access _______ of data at a time
• Logical view of memory arranged in rows of 4-bytes
– Still with separate addresses for each byte
5A 0x000000
13
F8
…
0x000001
0x000002
Logical Byte-Oriented View of Mem.
Proc. Mem.
32
32
A
D
5A137C
2933
… 0x000008
0x000004
0x000000
Logical Word-Oriented View
F8
AD8E
int x,y=5;z=8;x = y+z;
Recall variables live in memory & need to
be loaded into the processor to be used
10.28
Memory & Data Size
Byte operations only access the byte at the specified address
NN+1N+2N+3
(Assume start address = N)
Halfword operations access the 2-bytes starting at the specified address
NN+1N+2N+3
Word operations access the 4-bytes starting at the specified address
NN+1N+2N+3
• Little-endian memory can be thought of as right justified
• Always provide the LS-Byte address of the desired data
• Size is explicitly defined by the instruction used
• Memory Access Rules
– Halfword or Word access must start on an address that is a multiple of that data size (i.e. half = multiple of 2, word = multiple of 4)
Byte
31 0
Half
15
Word
31 0
LB
LH
LW
Registers: Memory
Used to load a 1-byte var. (char)
Used to load a 4-byte variable (int)
10.29
Memory Read Instructions (Signed)
LB (Load Byte)Provide address of
desired byte
LH (Load Half)Provide address of
starting byte
LW (Load Word)Provide address of
starting byte
Sign Extend
31 0
Byte
7
GPR
Sign Extend
31 0
Half
15
Word
31 0
If address = 0x02Reg. = 0x_____________
If address = 0x00Reg. = 0x_____________
If address = 0x00Reg. = 0x____________
5A 13 7C
… 000004
000000F8
5A 13 7C
… 000004
000000F8
5A 13 7C
… 000004
000000F8
Memory
10.30
Memory Read Instructions (Unsigned)
LBU (Load Byte)Provide address of
desired byte
LHU (Load Half)Provide address of
starting byte
LW (Load Word)Provide address of
starting byte
Zero Extend
31 0
Byte
7
GPR
Zero Extend
31 0
Half
15
Word
31 0
If address = 0x01Reg. = 0x__________
If address = 0x00Reg. = 0x___________
If address = 0x00Reg. = 0x____________
Memory
5A 13 7C
… 000004
000000F8
5A 13 7C
… 000004
000000F8
5A 13 7C
… 000004
000000F8
10.31
Memory Write Instructions
SB (Store Byte)Provide address of
desired byte
SH (Store Half)Provide address of
starting byte
SW (Store Word)Provide address of
starting byte
if address = 0x02
if address = 0x02
if address = 0x00
Memory
31 0
Byte
7
GPR
31 0
Half
15
Word
31 0
Reg. = 0x12345678
Reg. = 0x12345678
Reg. = 0x12345678
… 000004
000000
… 000004
000000
… 000004
000000
10.32
MIPS Memory Alignment Limitations
• Bytes can start at any address• Halfwords must start on an
even address
• Words must start on an address that is a multiple of 4
• Examples:– Word @ A18C –
– Halfword @ FFE6 –
– Word @ A18E –
– Halfword @ FFE5 –
F87C
…
00A18C
Addr
00FFE4C1 4B29EA
49CF
5A13
BD52
10.33
Load Format (LW,LH,LB)
• Syntax: LW $rt, offset($rs)
– $rt = Destination register
– offset($rs) = Address of desired data
– Operation: $rt = Mem[ offset + $rs ]
– offset limited to 16-bit signed number
• Examples
– LW $2, 0x40($3) // $2 = ________________
– LBU $2, -1($4) // $2 = ________________
– LH $2, 0xFFFC($4) // $2 = ________________
5A12C5B7
0x002048
134982FE
F8BE97CD
0x002044
0x002040
00002000$3
0000204C$4
old val.$2
MemoryAddress
Registers
10.34
More LOAD Examples
• Examples
– LB $2,0x45($3) // $2 = _____________
– LH $2,-6($4) // $2 = _____________
– LHU $2, -2($4) // $2 = _____________
5A12C5B7
0x002048
134982FE
F8BE97CD
0x002044
0x002040
00002000
0000204C
old val.
$3
$4
$2
MemoryAddress
Registers
10.35
Store Format (SW,SH,SB)
• SW $rt, offset($rs)
– $rt = Source register
– offset($rs) = Address to store data
– Operation: Mem[ offset + $rs ] = $rt
– offset limited to 16-bit signed number
• Examples
– SW $2, 0x40($3)
– SB $2, -5($4)
– SH $2, 0xFFFE($4)
00002000
0000204C
123489AB
$3
$4
$2
Memory AddressRegisters
0x002048_ _ _ _ _ _ _ _
0x002044
0x002040
_ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
10.36
Loading an Immediate
• If immediate (constant) ___________________
– Use ______ or _________ instruction with _____ register
– Examples
• ADDI $2, $0, 1 // $2 = 0 + 1 = 1 (Loads const. 1 into $2)
• ORI $2, $0, 0xF110 // $2 = 0 | 0xF110 = 0xF110 (Loads 0xF110)
• If immediate more than 16-bits
– Immediates limited to 16-bits so we must load constant with a 2 instruction sequence using the special
___________________________ instruction
– To load $2 with 0x12345678
• _______________________
• _______________________
$2
$2
10.37
I-Type Instructions
• I-Type (Immediate) Format
– rs, rt are 5-bit fields for register numbers
– I = Immediate is a 16-bit constant
– opcode identifies actual operation
• Example:
– ADDI $5, $24, 1
– LW $5, -8($3)
opcode rs (src1)
6-bits 5-bits
rt (src/dst)
5-bits
immediate
16-bits
001000 11000
opcode rs
00101
rt
ADDI $24 $5
immediate
1
010111 00011 00101
LW $3 $5 -8LW is explained in the next sectionbut is an example of an instruction
using the I-type format
Fill me in…
10.38
Translating to Machine Code• 32-bit Fixed Size Instructions broken into 3 types (R-, I-, and J-)
based on __________…
• ___________
– Arithmetic/Logic instructions
– 3 register operands or shift amount
• ___________
– Use for data transfer, branches, etc.
– 2 registers +16-bit const.
• _________
– 26-bit jump address
– We'll cover this later
opcode rs (src1)
6-bits 5-bits
rt (src2)
5-bits
rd (dest)
5-bits
shamt
5-bits
function
6-bits
opcode rs (src1)
6-bits 5-bits
rt (src/dst)
5-bits
immediate
16-bits
opcode__-Type Jump address
26-bits6-bits
__-Type
__-Type
add $5,$7,$8 000000 ______ ______ ______ ______ 100000
lw $18, -4($3) 100011 ______ ______ _____ _____ _____ _____
j 0x0400018 000010 0000 0100 0000 0000 0000 0001 10
Each type uses portions of the instruction to "code" certain aspects ofthe instruction. But they all start with an opcode that helps determine
which type will be used.
10.39
COMPILING HIGH-LEVEL CODE
"Be the Compiler"
10.40
Tips for Translating to Assembly
• We will now translate C code to assembly
• A few things to remember:
– Data variables live in memory
– Data must be brought into registers before being processed
– You must have an address/pointer in a register to load/store data to/from memory
• Generally, you will need 4 steps to translate C to assembly:
– ________________ in a register (LUI + ORI)
– _______ data from memory to a register (___________)
– ___________ data (ADD, SUB, AND, OR, etc.)
– ________ data back to memory (____________)
10.41
Translating HLL to Assembly
• HLL variables are simply locations in memory
– A variable name really translates to an address in assemblyC operator Assembly Notes
int x,y,z;…x = y + z;
LUI $8, 0x1000ORI $8, $8, 0x0004
Assume x @ 0x10000004& y @ 0x10000008& z @ 0x1000000C
char a[100];…a[1]--;
Assume array ‘a’ starts @ 0x1000000C
10.42
Translating HLL to Assembly
C operator Assembly Notes
int dat[4],x;…x = dat[0];x += dat[1];
LUI $8, 0x1000ORI $8, $8, 0x0010LW $9, 0($8)
Assume dat @ 0x10000010& x @ 0x10000020
unsigned int y;short z;y = y / 4;z = z
10.45
Our Simulator - MARS
Download at: http://courses.missouristate.edu/KenVollmar/MARS/
10.46
Assembler Syntax
• In MARS and most assemblers each line of the assembly program may be one of three
possible options
– Comment
– Instruction / Pseudo-instruction
– _________________________
10.47
Comments
• In MARS an entire line can be marked as a comment by starting it with a pound (#) character:
• Example:
# This line will be ignored by the assembler
LW $2,8($3)
ADDI $2,$2,1
...
10.48
Instructions
• In MARS each instruction is written on a separate line and has the following syntax:(Label:) Instruc. Op. Operands Comment
• Example:
START: ADD $2,$3,$4 # R[2]=R[3] + R[4]
• Notes:
– Label is optional and is a text identifier for the address where the instruction is placed in memory. (These are normally used to identify the target of a branch or jump instruction.)
– In MARS, a comment can be inserted after an instruction by using a ‘#’ sign
– A label can be on a line by itself in which case it refers to the address of the first instruction listed after it
10.49
Labels and Instructions
• The optional label in front of an instruction evaluates to the ____________ where the instruction or data starts in memory and can be used in other instructions
.text
START: LW $4,8($10)
L1: ADDI $4,$4,-1
BNE $4,$0,L1
J START
LW
ADDI
BNE
J
0x400000 = START
0x400004 = L1
0x400008
0x40000C
Assembly Source File
…and replaces the labels with their corresponding address
Assembler finds what address each instruction
starts at…
Note: The BNE instruc. causes the program to branch (jump) to the
instruction at the specified address if the two operands are Not Equal. The J(ump) instruction causes program execution to jump to the specified label (address).
.text
LW $4,8($10)
ADDI $4,$4,-1
BNE $4,$0,0x400004
J 0x400000
10.50
Assembler Directives
• Similar to pre-processor statements (#include, #define, etc.) and global variable declarations in
C/C++
– Text and data segments
– Reserving & initializing global variables and constants
– Compiler and linker status
• Direct the assembler in how to assemble the actual instructions and how to initialize memory when the
program is loaded
10.51
An Example
• This is output from an actual MIPS gcc/g++
compiler
• Actual instructions are at the bottom (addiu, srl, etc.)
• Directives are the things starting with .
• Labels are names ending with :
• Let's learn about some of the directives
x:
.word 5
.globl nums
.section .bss
.align 2
.type nums, @object
.size nums, 40
nums:
.space 40
.text
.align 2
.globl _Z6calleei
$LFB2:
.ent _Z6calleei
_Z6calleei:
.frame $sp,0,$31
.mask 0x00000000,0
.fmask 0x00000000,0
addiu $2,$4,3
srl $3,$2,31
addu $2,$2,$3
10.52
Text and Static Data Segments
• .text directive indicates the following instructions should be
placed in the program area of
memory
• .data directive indicates the following data declarations will
be placed in the data memory
segment
Unused
0x0040_0000
Text Segment
Static Data Segment
Dynamic Data Segment
Stack
I/O Space
0x1000_0000
0x8000_0000
0xFFFF_FFFC
0x1000_8000
0x7FFF_FFFC
0x0000_0000
10.53
Static Data Directives
• Fills memory with specified data when program is loaded
• Format:
(Label:) .type_id val_0,val_1,…,val_n
• type_id = {.byte, .half, .word, .float, .double}
• Each value in the comma separated list will be stored using the indicated size
– Example: myval: .word 1, 2, 0x0003
• Each value 1, 2, 3 is stored as a word (i.e. 32-bits)
• Label “myval” evaluates to the start address of the first word (i.e. of the value 1)
10.54
More Static Data Directives
• Can be used to initialize ASCII strings
• Format:
(Label:) .ascii “string”
(Label:) .asciiz “string”
• .asciiz adds a null-termination character (0) at the end of the string while .ascii does not
– Example: myval: .asciiz “Hello world\n”
• C-strings are just character arrays terminated with a null character ('\0' ASCII = 00 decimal)
• Each character stored as a byte (including '\n' = Line Feed)
• Label “myval” evaluates to the start address of the first byte of the string
10.55
Reserving Memory
• Reserves space in memory but leaves the contents unchanged
• Format:
(Label:) .space num_bytes
.data
dat1: .word 0x12345678
array: .space 4
dat2: .word 0xFEDCBA98
00 00 00 00
FE DC BA 98
0x1000000C
00 00 00 00
0x10000008 = dat2
0x10000004 = array
12 34 56 78 0x10000000 = dat1
Skipped
10.56
Alignment Directive
• Used to skip to the next, correctly-aligned address for the given data size
• Format:
• 0 = byte-, 1 = half-, 2 = word-, 3 = double-alignment
.align 0,1,2, or 3
.data
dat1: .byte 1, 2, 3
.align 1
dat2: .half 0x4567
.align 2
dat3: .word 0x89ABCDEF
00 00 00 00
89 AB CD EF
0x1000000C
00 00 45 67
0x10000008 = dat3
0x10000004 = dat2
00 03 02 01 0x10000000 = dat1Skipped
Skipped
Note: The number after .align is not how many bytes to skip, it indicates what type of data will come
next and thus the size to be aligned
10.57
.data example Examples
• C1 evaluates to ________________________
• MSG evaluates to ________________ (Note: \n = Line Feed char. = 0x0A)
• DAT evaluates to _________________
• VAR evaluates to _________________
.data
C1: .byte 0xFE,0x05
MSG: .asciiz “SC\n”
DAT: .half 1,2
.align 2
VAR: .word 0x12345678 0x10010000
0x10010004
0x10010008
0x1001000C
10.58
C/C++ and Directives
• Directives are used to initialize or reserve space for global variables in C
short int count = 7;
char message[16];
int table[8] = {0,1,2,3,4,5,6,7};
void main()
{
...
}
.data
count:
message:
.align ______
table: .word ________________
.text
.globl main
main: ...
C/C++ style global declarations Assembly equivalent
10.59
Summary & Notes
• Assembler Directives:– Tell the assembler how to build the program memory
image• Where instructions and data should be placed in memory when
the program is loaded
• How to initialize certain global variables
• Recall, a compiler/assembler simply outputs a memory IMAGE of the program. It must then be loaded into memory by the OS to be executed.
• Key: Directives are NOT instructions!– They are used by the assembler to create the memory
image and then removed
– The MIPS processor never sees these directives!
10.60
Directives in the Software Flow
1110 0010 0101 10010110 1011 0000 11000100 1101 0111 11111010 1100 0010 10110001 0110 0011 1000
MOVE.W X,D0CMPI.W #0,D0BLE SKIPADD Y,D0SUB Z,D0
SKIP MUL …
High Level Language
Description
Assembly (.asm/.s files)
Executable Binary Image
int n = 0xC259;void main(){if (x > 0)x = x + y - z;
a = b*x;
.datan: .word 0xC259
.textSLT $4,$2,$0BNE SKIP…
SKIP: MUL …
1110 0010 0101 10010110 1011 0000 11000100 1101 0111 11111010 1100 0010 10110001 0110 0011 1000
.c/.cpp files1110 0010 0101 10010110 1011 0000 11000100 1101 0111 11111010 1100 0010 10110001 0110 0011 1000
Object/Machine Code(.o files)
Compiler
Assembler
LinkerLoader /
OS
Program Executing
Assembler Directives are used to create the
object code (executable) image…
…the processor NEVER sees/executes these
directives
PC
SLT
BNE
10.61
Pseudo-instructions
• “Macros” translated by the assembler to instructions actually supported by the HW
• Simplifies writing code in assembly
• Example – LI (Load-immediate) pseudo-instruction translated by assembler to 2
instruction sequence (LUI & ORI)
...
lui $2, 0x1234
ori $2, $2, 0x5678
...
...
li $2, 0x12345678
...
With pseudo-instruction After assembler…
10.62
Pseudo-instructions
Pseudo-instruction Actual Assembly
NOT Rd,Rs NOR Rd,Rs,$0
NEG Rd,Rs SUB Rd,$0,Rs
LI Rt, immed. # Load Immediate LUI Rt, {immediate[31:16], 16’b0}
ORI Rt, {16’b0, immediate[15:0]}
LA Rt, label # Load Address LUI Rt, {immediate[31:16], 16’b0}
ORI Rt, {16’b0, immediate[15:0]}
BLT Rs,Rt,Label SLT $1,Rs,Rt
BNE $1,$0,Label
Note: Pseudoinstructions are assembler-dependent. See MARS Help for more details.
10.63
Support for Pseudo-instructions
• Pseudo-instructions often expand to several instructions and there is a need for usage of a
temporary register
• Assembler reserves register $1
– In the assembler, $1 = $at (assembler temp.)
• You can use $1 but it will be overwritten when you use certain pseudo-instructions
10.64
Coding Exercise with MARS
• int x = 7, y = 5, z = 3; z = x * z + (x – y++)
• # #DEFINE MASK 0xe0;# PORTD &= ~(MASK)
# PORTD |= ((x
10.65
INSTRUCTION SET ARCHITECTURE
What are the common features of all processor instruction sets?
10.66
Components of an ISA
1. ________ and Address Size– 8-, 16-, 32-, 64-bit
2. Which instructions does the processor support– SUBtract instruc. vs. NEGate + ADD instrucs.
3. ________________________ of instructions– How is the operation and operands represented with 1’s
and 0’s
4. __________ accessible to the instructions– Faster than accessing data from memory
5. Addressing Modes– How instructions can specify location of data operands
10.67
Historic Progression of Data Size & Registers
Processor Year Trans. Count
Data Size GPRs
8088 1979 29K 8 8
80286 1982 134K 16 8
80386/486 ’85/’89 275K/1.18M
32 8
Pentium 1993 3.1M 32 >8
Pentium 4 2000 42M 32 >= 128
Core 2 Duo 2006 291M 64 >= 128
6-core Core i7 2011 2.27B 64 >= 128
MIPS 1999 var. 32 32
10.68
General Instruction Format Issues
• Instructions must specify three things:
– ______________________________________
– Source operands
• Usually 2 source operands (e.g. X+Y)
– ______________________________________
• Example: ADD $8, $9, $10 ($8 = $9 + $10 where $ = Register)
• Binary (machine-code) representation broken into fields of bits for each part
000000 00000
Arith. Unused
OpCode
100000
Add
FunctionShift Amount
01001 01010
$9 $10
Src. 1 Src. 2 Dest.
01000
$8
10.69
Historical Instruction Formats
• Different instruction sets specify these differently
– 3 operand instruction set (MIPS, PPC, ARM)
• Similar to example on previous page
• Format: ADD DST, SRC1, SRC2 (DST = SRC1 + SRC2)
– 2 operand instructions (Intel / Motorola 68K)
• Second operand doubles as source and destination
• Format: ADD SRC1, S2/D (S2/D = SRC1 + S2/D)
– 1 operand instructions (Old Intel FP, Low-End Embedded)
• Implicit operand to every instruction usually known as the Accumulator (or ACC) register
• Format: ADD SRC1 (ACC = ACC + SRC1)
10.70
Historical Instruction Format Examples
Single-Operand Two-Operand Three-OperandLOAD X
ADD Y
SUB Z
STORE F
LOAD A
ADD B
STORE G
MOVE F,X
ADD F,Y
SUB F,Z
MOVE G,A
ADD G,B
ADD F,X,Y
SUB F,F,Z
ADD G,A,B
(+) Smaller size to encode each instruction
(-) Higher instruction count to load and store ACC value
Compromise of two extremes (+) More natural program style
(+) Smaller instruction count
(-) Larger size to encode each instruction
• Consider the pros and cons of each format when performing the set of operations– F = X + Y – Z– G = A + B
• Simple embedded computers often use single operand format – Smaller data size (8-bit or 16-bit machines) means limited instruc. size
• Modern, high performance processors use 2- and 3-operand formats
10.71
MIPS Instruction Format
• _______________ operand format
– Most ALU instructions use 3 registers as their operands
– All operations are performed on entire 32-bits (no size distinction)
– Example: ADD $t0, $t1, $t2
• ______________ architecture
– Load (read) data values from memory into a register
– Perform operations on registers
– Store (write) data values back to memory
– Different load/store instructions for different operand sizes (i.e. byte, half, word)
Proc.
1.) Load operands to proc. registers
Mem.
Proc.
2.) Proc. Performs operation using register values
Mem.
Proc.
3.) Store results back to memory
Mem.
Load/Store Architecture
Recommended