Transcript Chapter 10

Chapter 10
The Assembly Process
What Assemblers Do
• Translates assembly language into
machine code.
• Assigns addresses to all symbolic labels
(variables and labels on statements).
• Determines initial state of the memory
(program and data) in order to execute a
program.
Macros
• Some assemblers allow the programmer
to define a sequence of instructions to be
associated with a keyword.
• The statements in the macro replace the
statement that uses the macro name.
• Functions much like an include directive.
• Some assemblers are advanced and allow
for symbolic replacement of arguments.
Smart Assemblers
• Typical assemblers translate the assembly
language to machine language in a 1 to 1
method.
• A smart assembler is a little bit like what a
compiler does; translates a single statement
into multiple machine language statements.
• MIPS Assembly Language uses a smart
assembler, True Assembly Language is 1-to1 with machine language.
True Assembly Language
• Defines the machine architecture. I.e.,
what must be built into the machine.
• TAL arithmetic and logic instructions
– Must have 3 operands
– MAL allowed 2 for an abbreviated instruction.
– MAL allowed for 3 registers or 2 registers and
an immediate
– TAL requires a different instruction for an
immediate operand
Immediate Operands
• MAL allows the following
– Add $t1,$t2,$t3
– Add $t1, $t2, 8
• In TAL, the first is fine, but for the
immediate operand, you would use
– Addi $t1, $t2, 8
• Other immediate instructions are: andi, lui,
ori, xori.
– Must work with only 16 bits.
Shift
• Recall the 3 shift instructions in MAL:
– Srl
– Sra
– Sll
• Can have 3 register operands or 2
registers and a count (immediate).
• In TAL, if you want to use 3 register
operands, you must use srlv, srav, sllv
– Shift a variable amount
Multiplication
• In MAL, you could use:
– Mul $t1, $t2, $t3
• But we know that multiplying two 32 bit values
could produce a 64 bit value.
• The machine (and TAL) multiply the two operands
and place the result in a special set of registers
called HI and LO
• So the mul instruction above is translated as
– Mult $t2, $t3
– Mflo $t1 #move from lo to reg. t1
– Should check HI for non zero value
Division
• Similar to multiplication, MAL has:
– Div $t1, $t2, $t3
– Rem $t1, $t2, $t3
• The machine (and TAL) places the quotient in
LO and the remainder in HI
• So we have the above translating into:
–
–
–
–
Div $t2, $t3
Mflo $t1
#place the quotient into t1
Div $t2, $t3
Mfhi $t1 #place the remainder into t1
Unsigned Arithmetic
• May want to look at the bits as bigger
unsigned values rather than twos
complement
• Or, you may want to ignore overflow.
• Unsigned arithmetic ignores overflow.
• Addu, subu, multu, divu, addiu
Branch Instructions
• Unconditional
– MAL uses: b label
– TAL uses: j address
• MAL has many branch instructions, recall
– Beq, bne, blt, bgt, ble, bge, bltz, bgtz, blez,
bgez, bnez, beqz
• TAL only has
– bltz, bgtz, blez, bgez, bne, beq
Branching
• In MAL, you would do something like
– Blt $t1, $t2, again
• The assembler translates this to the following
TAL code:
– Sub $at, $t1, $t2
– Bltz $at, again
• The MAL beqz and bnez can be translated
using $0 as an operand with beq and bne.
Problems
• Look at blt $t1, $t2, repeat, where
– $t1 has close to the largest positive value and
– $t2 has close to the most negative value
• When we do sub $at, $t1, $t2 we will get a
value too big to be held -> overflow
• Could use subu which has no overflow.
– But does not give the correct answer for
branching
Comparison Solution
• Create a new instruction to do
comparisons that will not have overflow
problems (does not use subtraction).
• The following TAL instruction does this:
– Slt $10, $11, $12
– Sets $10 to 1 if $11 is less than $12.
– Sets $10 to 0 otherwise.
– Also available in slti form
• Now use with bne, beq, etc. for branching
Load Address
• MAL has a load address (la) instruction. TAL
does not.
• Let’s review what is being accomplished.
– La $8, begin
– Puts the 32 bit address of the label begin into
register $8.
• Can’t have all 32 bits as an immediate
operand, only 16.
• Use two immediate instructions each with 16
of the 32 bits.
Loading a register
• Need an instruction to load the higher 16
bits and another to load the lower 16 bits.
• Lui – load upper immediate – loads the
upper half of the register with the value
specified. Leaves the lower half with 0’s.
• Ori – or immediate. Logical oring of the
rightmost 16 bits with the specified value.
Loading an address
• First you need the address to load.
• As a programmer, you should not deal with
this (know how it is done by the assembler,
but you should not hard code with fixed
addresses).
• The assembler determines the address, say,
0X4083f3a4 (the 0X indicates base 16).
– lui $8,0x4083
– Ori $8, $8, 0xf3a4
Machine Code Format
• The MIPS machine instructions are all 32 bits in
length.
• Some bits are for the operation (opcode), and
then some are for the operands.
• The immediate instructions have the following
format: (Rs – source register, Rt – target reg.)
6-bits
5
5
16
Opcode R2
R1
Immediate operand
Immediate Example
• The instruction:
– Addi $13, $7, 50 would be translated as
001000 00111 01101 0000000000110010
Arithmetic Logic Instructions
• Have the layout:
Opcode R2
R3
R1
Extended opcode
• The opcode is always 000000
• The exended opcode specifies the function.
• Appendix C has opcodes and extended
opcodes.
Arithmetic Instruction Example
• Let’s take the
instruction:
– Add $13, $7, $8
• Converted to machine
language would be:
000000 00111
01000 01101 00000101111
The Assembly Process
• Need to be given where the data segment
and text segment will start.
• The assembler will first go through the code
creating a symbol table
– This table has pairs (symbol name, address) as
entries.
– Just looks at labels.
– Looks at commands and increments a counter
• While doing this, can replace MAL with TAL
statements (and adjust the counter).
Pass 2
• We needed to create a symbol table first
since a branch instruction may refer to a
label that we have not seen yet.
• Now we can go through the TAL program
translating the instructions into machine
language.
• Now we know the addresses, so we can
fill them in.
Branching
• A branch statement has an address as an
operand. This takes 32 bits. But we
cannot use 32 bits for one operand of an
instruction.
• The branch destination is calculated by the
cpu as the contents of the PC+offset
(immediate in the instruction – 16 bits).
• So the offset = address of destination –
(address of branch instruction +4)
• Why +4???
More Scope
• This allows us to branch to destinations a
distance from the PC between -215 and 215-1
• Each instruction take 4 bytes.
• An instruction address is divisible by 4
• Only branch to instruction addresses
• In binary, what do all values divisible by 4 have
in common?
• Leave them out
• Now the 16 bits really represent values from -217
to 217-1
Jump
•
•
•
•
The jump instruction has only one operand
So we have 26 bits for the address.
Still not a 32 bit address 
Can do the same thing as with branch
– Don’t store the last 2 zero bits since all
destination addresses are divisible by 4
• Now we can represent 28 bits with just 26
bits.
– Still not a 32 bit address 
Jump address
• We need 4 more bits.
• This will be the high order 4 bits of the PC
• So the cpu will create the jump address by
taking the 26 bits in the operand, adding
two 0’s to the right and copying the left 4
bits of the PC into the left 4 bits of the
jump address.
• Reverse this process to create the jump
address
Long Branches
• Recall that we can only branch a distance
of about 217 from the current instruction.
• What if we need a conditional branch for a
longer distance.
• Bgtz $5, long_away
• Change to
Blez $5, around
J long_away
Around: ….
Program Relocation
• Each time a program is loaded into
memory, it may be loaded into a different
location.
– We can have several programs running on a
machine at any time.
• Addresses need to be adjusted based on
where the program starts to load.
• This is the job of the loader
Absolute vs. Relative Address
• Not all addresses need to be adjusted.
• Some addresses are absolute addresses
– Those used in a la instruction
– Those used in a jump
– Etc
• Some addresses are relative addresses
– Those used in a branch instruction (relative to
the PC).
• Relative addresses do not need to be
adjusted (relocated).