Addressing Modes
- There are a number of addressing modes an assembly language can support
- Section 5.2
- I will use load, but store is appropriate as well.
- Immediate
- LOAD Rdest, immed
- store the immediate in the register, sign extend
- Is this really memory accessing?
- Direct addressing
- LOAD Rdest, address
- Load the register from the value stored at address
- Problematic because the instruction must be larger than a word
- Register Indirect addressing
- LOAD Rdest, Rsrc
- Rdest = M[Rsrc]
- Fits in a word.
- Indirect (register or memory)
- LOAD Rdest, @address
- M[address] is a pointer to the data.
- dest = M[M[address]]
- We will discard this as it messes up our pipeline.
- Indexed (for arrays)
- We need a base address plus an offset
- LOAD Rdest, index, address
- Rdest = M [address + index]
- Load Rdest, index, Rsrc
- Rdest = M [src + index]
- We may need a multiplyer (for data types larger than a single word)
- LOAD Rdest index, size, address
- Rdest = M[address + index * size]
- - or combinations involving registers.
- Auto Incrementing
- LOAD Rdest, +Rsrc
- Rdest = M[Rsrc++]
- pre/post increment/decrement
- Look at table 5.1 on page 191 for a summary
- Most RISC architectures use Register indexed
- LOAD Rdest, imm, Rsrc
- LOAD Rdest, Rsrc1, Rsrc2
- May have to use SETHI for large displacements
- We can accomplish everything (but perhaps in multiple instructions)
- We only do one data memory access per instruction.