0% found this document useful (0 votes)
226 views13 pages

ARM Addressing Modes Guide

The document discusses load and store instructions in ARM that access memory locations using base registers and offsets. It describes two addressing modes - pre-indexed addressing, where the offset is applied before accessing memory, and post-indexed addressing, where the offset is applied after. Pre-indexed addressing can optionally auto-increment the base register. Post-indexed addressing always auto-increments the base register.

Uploaded by

Manjula Vijh
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
226 views13 pages

ARM Addressing Modes Guide

The document discusses load and store instructions in ARM that access memory locations using base registers and offsets. It describes two addressing modes - pre-indexed addressing, where the offset is applied before accessing memory, and post-indexed addressing, where the offset is applied after. Pre-indexed addressing can optionally auto-increment the base register. Post-indexed addressing always auto-increments the base register.

Uploaded by

Manjula Vijh
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd

Load and Store Word or Byte:

Base Register
* The memory location to be accessed is held in a base register
• STR r0, [r1] ; Store contents of r0 to location pointed to
; by contents of r1.
• LDR r2, [r1] ; Load r2 with contents of memory location
; pointed to by contents of r1.

r0 Memory
Source
Register 0x5
for STR

r1 r2
Base Destination
Register 0x200 0x200 0x5 0x5 Register
for LDR

The ARM Addressing Mode - 1 Embedded Systems Lab./Honam University


Interpreting Address

1. Little Endian 7 0
(PDP-11,Intel 80x86)
2. Big Endian 0 7
(IBM360/370,Motorola)

Alignment
Byte Address : A
Object size : s
Byte address oriented memory will align if Mod[A,s] = 0

Addressing Mode
Effective Address
PC – Relative addressing: Mainly used for control transfer
The ARM Addressing Mode - 2 Embedded Systems Lab./Honam University
Memory Addressing

Addressing Modes
Register
Immediate
Displacement
Register Indirect
Indexed
Direct or Absolute
Memory Indirect
Autoincreament
Auto decrement
Scaled

The ARM Addressing Mode - 3 Embedded Systems Lab./Honam University


Addressing Modes

* Register
• Value is in a register
– Add R4, R3
– Regs[R4]  Regs[R4] + Regs[R3]
* Immediate
• Constant value is in the instruction
– Add R4, #3
– Regs[R4]  Regs[R4] + 3
* Displacement
• Relative addressing for access to local variables
– Add R4, 100(R1)
– Regs[R4]  Regs[R4] + Mem[100+Regs[R1]]

The ARM Addressing Mode - 4 Embedded Systems Lab./Honam University


Addressing Modes

* Indirect or Register deferred


• Address of the operand is in a register
– Add R4, (R1)
– Regs[R4]  Regs[R4] + Mem[Regs[R1]]
* Indexed
• Base + index addressing; useful in array addressing
– Add R3, (R1+R2)
– Regs[R3]  Regs[R3] + Mem[Regs[R1]+Regs[R2]]
* Direct or Absolute
• Static addressing for access to local variables
– Add R1, (1001)
– Regs[R1]  Regs[R1] + Mem[1001]

The ARM Addressing Mode - 5 Embedded Systems Lab./Honam University


Addressing Modes

* Memory indirect
• The address of the address of the operand is in a register
– Add R1, @(R3)
– Regs[R1]  Regs[R1] + Mem[Mem[Regs[R3]]]
* Auto-increment or Auto-decrement
• Useful for stepping through arrays or accessing stack elements
– Add R1, (R2)+
• Regs[R1]  Regs[R1] + Mem[Regs[R2]]

• Regs[R2]  Regs[R2] + d

– Add R1, -(R2)


• Regs[R2]  Regs[R2] - d

• Regs[R1]  Regs[R1] + Mem[Regs[R2]]

The ARM Addressing Mode - 6 Embedded Systems Lab./Honam University


Address Modes

1. Register Add R4,R3 Reg[R4] Reg[R4] + Reg[R3]


2. Immediate Add R4,#3 Reg[R4] Reg[R4] + 3
3. Displacement Add R4, 100(R1) Reg[R4] Reg[R4] + Mem[100 + Reg[R1]]
4. Register Indirect Add R4, (R1) Reg[R4] Reg[R4] + Mem[Reg[R1]]
5. Indexed Add R4, (R1+R2) Reg[R4] Reg[R4] +
Mem[Reg[R1]+Reg[R2]]
6. Absolute Add R4,(1000) Reg[R4] Reg[R4] + Mem[1000]
7. Memory Indexed Add R4,@(R3) Reg[R4] Reg[R4] + Mem[Mem[Reg[R3]]]
8. Auto Increment Add R4,(R2)+ Reg[R4] Reg[R4] +
Mem[Reg[R2]] Reg[R2] Reg[R2] + d
9. Auto decrement Add R4,-(R2) Reg[R2] Reg[R2] – d
Reg[R4] Reg[R4] + Mem[Reg[R2]]
10. Scaled Add R4,100(R2)[R3] Reg[R4] Reg[R4] + Mem[100 + Reg[R2] +
Reg[R3]*d

The ARM Addressing Mode - 7 Embedded Systems Lab./Honam University


Load and Store Word or Byte:
Offsets from the Base Register

* As well as accessing the actual location contained in the base register,


these instructions can access a location offset from the base register
pointer.
* This offset can be
• An unsigned 12bit immediate value (ie 0 - 4095 bytes).
• A register, optionally shifted by an immediate value
* This can be either added or subtracted from the base register:
• Prefix the offset value or register with ‘+’ (default) or ‘-’.
* This offset can be applied:
• before the transfer is made: Pre-indexed addressing
– optionally auto-incrementing the base register, by postfixing the
instruction with an ‘!’.
• after the transfer is made: Post-indexed addressing
– causing the base register to be auto-incremented.
The ARM Addressing Mode - 8 Embedded Systems Lab./Honam University
Load and Store Word or Byte:
Pre-indexed Addressing
* Example: STR r0, [r1,#12]
r0
Memory Source
0x5 Register
for STR
Offset
12 0x20c 0x5

r1
Base
Register 0x200 0x200

* To store to location 0x1f4 instead use: STR r0, [r1,#-12]


* To auto-increment base pointer to 0x20c use: STR r0, [r1, #12]!
* If r2 contains 3, access 0x20c by multiplying this by 4:
• STR r0, [r1, r2, LSL #2]

The ARM Addressing Mode - 9 Embedded Systems Lab./Honam University


Load and Store Word or Byte:
Post-indexed Addressing
* Example: STR r0, [r1], #12
Memory

r1 Offset r0
Updated Source
Base 0x20c 12 0x20c
0x5 Register
Register for STR

0x200 0x5
r1
Original
Base 0x200
Register
* To auto-increment the base register to location 0x1f4 instead use:
• STR r0, [r1], #-12
* If r2 contains 3, auto-incremenet base register to 0x20c by multiplying this by
4:
* STR r0, [r1], r2, LSL #2
The ARM Addressing Mode - 10 Embedded Systems Lab./Honam University
Load and Stores with User Mode Privilege

* When using post-indexed addressing, there is a further form of Load/Store


Word/Byte:
• <LDR|STR>{<cond>}{B}T Rd, <post_indexed_address>

* When used in a privileged mode, this does the load/store with user mode
privilege.
• Normally used by an exception handler that is emulating a memory access
instruction that would normally execute in user mode.

The ARM Addressing Mode - 11 Embedded Systems Lab./Honam University


Example Usage of
Addressing Modes
* Imagine an array, the first element of which is pointed to by the contents of
r0.
Memory
* If we want to access a particular element, element Offset
then we can use pre-indexed addressing:
• r1 is element we want.
• LDR r2, [r0, r1, LSL #2] 3 12
Pointer to 2 8
start of array
* If we want to step through every 1 4
element of the array, for instance r0 0 0
to produce sum of elements in the
array, then we can use post-indexed addressing within a loop:
• r1 is address of current element (initially equal to r0).
• LDR r2, [r1], #4
Use a further register to store the address of final element,
so that the loop can be correctly terminated.

The ARM Addressing Mode - 12 Embedded Systems Lab./Honam University


Offsets for Halfword and Signed Halfword / Byte
Access
* The Load and Store Halfword and Load Signed Byte or Halfword
instructions can make use of pre- and post-indexed addressing in much the
same way as the basic load and store instructions.
* However the actual offset formats are more constrained:
• The immediate value is limited to 8 bits (rather than 12 bits) giving an offset
of 0-255 bytes.
• The register form cannot have a shift applied to it.

The ARM Addressing Mode - 13 Embedded Systems Lab./Honam University

You might also like