Memory Accesses register
The Cortex-M0 and Cortex-M0+ processors support a number of memory access instructions, which support various data transfer sizes and addressing modes. The supported data transfer sizes are Word, Half Word, and Byte
Table: Memory access instructions for various transfer sizes
Transfer size Unsigned load Signed load Signed/Unsigned store
•Word LDR LDR STR
•Half word LDRH LDRSH STRH
•Byte LDRB LDRSB STRB
For memory read operations, the instruction to carry out single accesses is LDR (load):
Instruction used: LDR/LDRH/LDRB
Function: Read single memory data into register
Syntax: LDR <Rt>, [<Rn>, <Rm>] ; Word read
LDRH <Rt>, [<Rn>, <Rm>] ; Half-Word read
LDRB <Rt>, [<Rn>, <Rm>] ; Byte read
Rt = memory[Rn + Rm]
Rt, Rn, and Rm are low registersThe Cortex-M processors also support immediate offset addressing modes:
Instruction used: LDR/LDRH/LDRB
Function: Read single memory data into register
Syntax: LDR <Rt>, [<Rn>, #immed5] ; Word read
LDRH <Rt>, [<Rn>, #immed5] ; Half-Word read
LDRB <Rt>, [<Rn>, #immed5] ; Byte read
Note:
Rt = memory[Rn + ZeroExtend (#immed5 << 2)] ; Word
Rt = memory[Rn + ZeroExtend(#immed5 << 1)] ; Half word
Rt = memory[Rn + ZeroExtend(#immed5)] ; Byte
Rt and Rn are low registers
The Cortex-M Processors support a useful PC-relative load instruction allowing efficient literal data accesses.
Instruction used:LDR
Function: Read single memory data word into register
Syntax: LDR <Rt>, [PC, #immed8] ; Word read
Note: Rt = memory[WordAligned(PC+4) + ZeroExtend(#immed8 << 2)]
Rt is a low register, and targeted address must be a word-aligned address. The reason for adding 4 is due to the pipelined nature of the processor.
Example:
LDR R0,=0x12345678 ; A pseudo instruction that use literal load to put an immediate data into a register
LDR R0, [PC, #0x40] ; Load a data in current program address with offset of 0x40 into R0
LDR R0, label ; Load a data in current program referenced by label into R0
Function : Read single memory data word into register
Syntax: LDR <Rt>, [SP, #immed8] ; Word read Note:
vRt = memory[SP + ZeroExtend(#immed8 << 2)]
vRt is a low registeThe Cortex-M0/M0+ Processor can also sign extend the read data automatically using the LDRSB and LDRSH instructions.
Instruction used: LDRSH/LDRSB
Function: Read single signed memory data into register
Syntax:LDRSH <Rt>, [<Rn>, <Rm>] ; Half-Word read
LDRSB <Rt>, [<Rn>, <Rm>] ; Byte read
Note:
Rt = SignExtend(memory[Rn + Rm])
Rt, Rn, and Rm are low register
Instruction used: STR/STRH/STRB
Function: Write single register data into memory
Syntax: STR <Rt>, [<Rn>, <Rm>] ; Word write
STRH <Rt>, [<Rn>, <Rm>] ; Half-Word write
STRB <Rt>, [<Rn>, <Rm>] ; Byte write
Note:
memory[Rn + Rm] = Rt
Rt, Rn, and Rm are low registers
Instruction used: STR/STRH/STRB
Function: Write single memory data into memory
Syntax: STR <Rt>, [<Rn>, #immed5] ; Word write
STRH <Rt>, [<Rn>, #immed5] ; Half-Word write
STRB <Rt>, [<Rn>, #immed5] ; Byte write Note:
memory[Rn + ZeroExtend(#immed5 << 2)] = Rt ; Word
memory[Rn + ZeroExtend(#immed5 << 1)] = Rt ; Half word
memory[Rn + ZeroExtend(#immed5)] = Rt ; Byte
Rt and Rn are low registers
No comments:
Post a Comment