Download Assembly Process

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
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).