Lecture 16

advertisement
CS170 Computer Organization
and Architecture I
Ayman Abdel-Hamid
Department of Computer Science
Old Dominion University
Lecture 16: 10/29/2002
Lecture 16: 10/29/2002
CS170 Fall 2002
1
Outline
•Constant or Immediate Operands
•Pseudoinstrcutions
•Memory usage and a related pseudoinstruction
Lecture 16: 10/29/2002
CS170 Fall 2002
2
Constant Operands
1/6
•In the C compiler gcc, 52% of arithmetic operations involve constants. In circuit
simulation program spice it is 69%
x = x +4;
where x is associated with register $s0, the constant 4 is stored in memory at memory
address ADDR_4 What is the MIPS assembly code?
lw $t0, ADDR_4($zero)
# $t0  the constant 4
add $s0,$s0,$t0
# $s0  $s0 + 4
•This solution requires memory access to load a constant from memory (not efficient)
•Offer versions of arithmetic instructions in which operand can be a constant
•Use I-format (Immediate-format) for such instructions (2 registers and a constant)
•The MIPS field containing the constant is 16 bits long
Lecture 16: 10/29/2002
CS170 Fall 2002
3
Constant Operands
2/6
Add Immediate instruction
# $s0  $s0 +4
addi $s0,$s0,4
8
16
16
op
rs
rt
4
immediate
Immediate version of slt
slti $t0,$s2,10
# $t0 = 1 if $s2 < 10
Design principle: Make the common case fast
Constant operands occur frequently, make constants part of arithmetic
instructions. Much faster than a memory load
Lecture 16: 10/29/2002
CS170 Fall 2002
4
Constant Operands
3/6
• How about constants bigger than 16 bits?
•Set upper 16 bits of a constant in a register using lui instruction
•A subsequent instruction can specify the lower 16 bits of the constant
lui $t0, 255
#255 is 0000 0000 1111 1111
•Transfer 16 bit immediate constant into leftmost 16 bits of register and fill
lower 16 bits with 0s.
Contents of register $t0 after lui instruction is executed
0000 0000 1111 1111
Lecture 16: 10/29/2002
0000 0000 0000 0000
CS170 Fall 2002
5
Constant Operands4/6
What is the MIPS assembly code to load the following 32-bit constant into register $s0?
0000 0000 0011 1101 0000 1001 0000 0000
•Load upper 16 bits using lui into $s0
lui $s0, 61
# 6110 = 0000 0000 0011 11012
•Add lower 16 bits whose lower value is 2304
addi $s0, $s0, 2304
# 230410 = 0000 1001 0000 00002
•Compiler or assembler break large constants into pieces and then reassemble into a
register
•If assembler performs such job, it needs a temporary register available in which to
create the long values
•Register $at is reserved for assembler
Lecture 16: 10/29/2002
CS170 Fall 2002
6
Constant Operands5/6
A word of caution
•addi sign extends 16-bit immediate field before performing addition
Copy leftmost bit (sign bit) of 16-bit immediate field of instruction
into upper 16 bits of a word before performing addition
•An alternative to addi is to use ori instruction (logical OR immediate) to
create 32-bit constants in conjunction with lui (especially useful for base
memory addresses)
ori $s0, $s0,2304
•ori loads 0s into the upper 16 bits (zero-extend immediate field)
•Why it is OK to use ori after lui?
Lecture 16: 10/29/2002
CS170 Fall 2002
7
Constant Operands6/6
•Any constant value can be expressed in decimal, binary, or hexadecimal
•By default the value is in decimal in instructions
•To represent in hex use 0x before constant value
lui $s0, 61
# 6110 = 0000 0000 0011 11012
To represent constant in hex
lui $s0,0x003D
Lecture 16: 10/29/2002
# Why 6110 is 003D16?
CS170 Fall 2002
8
Pseudoinstructions
•Some instructions are provided to simplify assembly language programming
and translation, and give a richer set of instructions than those implemented by
the hardware
•The assembler reads such instructions and replaces by a sequence of real
machine instructions that have the same effect
Example
move $t0,$t1
# pseudoinstruction $t0  $t1
Assembler converts this instruction into machine language equivalent
add $t0, $zero,$t1
# $t0  0 + $t1
•Other pseudoinstructions blt, bgt, bge, and ble
•You can use pseudoinstructions to simplify programming, but attempt to write
your programs in terms of REAL MIPS instructions
Lecture 16: 10/29/2002
CS170 Fall 2002
9
Memory Usage in MIPS
•See Figure A.9 (section A.5 in appendix A)
•Reserved for Operating System
•Program code (“Text”) starts at 0040 000016
(PC is program counter)
•Static data (data size known at compile time, and
lifetime is the program’s entire execution) starts at
1000 000016
•Dynamic data (allocation occurs during execution) is
next and grows up towards the stack
•Stack is dynamic (will see function when we look at
procedure calls)
•The register $gp is the global pointer and is set to an
address (1000 800016) to make it easy to access data
Lecture 16: 10/29/2002
CS170 Fall 2002
10
A related pseudoinstruction
How does an array address get loaded into a register?
•Array is allocated in the static data portion of the data segment
•We can use load address pseudoinstruction la rdest, symbolic address
la $s3, Address
•At compile time Address is known.
•Assume Address is 100000A416
•We need to put this value in $s3 using real instructions
•Immediate field is only 16 bits (4 hex digits)?
•In this case, la gets implemented using two instructions
lui $s3, 0x1000
addi $s3,$s3,0x00A4
Lecture 16: 10/29/2002
CS170 Fall 2002
11
Download