arm9嵌入式系统设计基础教程答案:嵌入式系统开发学习
arm9嵌入式系统设计基础教程答案:嵌入式系统开发学习Rd:目标寄存器(加载时数据被读取到该寄存器,存储时寄存器中的数被写入到内存)H,B表示size,H是半字,B是字节指令格式中:cond:条件助记符,如:EQ,NE等等S:表示有符号,没有S则是无符号
目标:学习掌握 ARM 半字、有符号字节的加载、存储指令的格式、地址模式。
ARM 半字、有符号字节加载存储指令:半字加载和字节加载分为有符号和无符号,这主要是因为寄存器是32位的,加载半字是16位,那么寄存器的高16位要进行扩展,无符号直接用‘0’扩展,如果是有符号数则要进行符号位扩展,扩展后正数依然是正数,负数依然是负数。
加载字节(8位)数据,同样寄存器高24位要扩展,无符号用‘0’,有符号进行符号位扩展。
图:ARM有符号字节、半字加载存储指令
指令格式中:
-
cond:条件助记符,如:EQ,NE等等
-
S:表示有符号,没有S则是无符号
-
H,B表示size,H是半字,B是字节
-
Rd:目标寄存器(加载时数据被读取到该寄存器,存储时寄存器中的数被写入到内存)
-
地址模式:见下图。
这里提到的加载存储指令包括:
-
半字加载/存储指令:LDRH、LDRSH STRH
-
有符号字节加载存储指令:LDRSB,存储同之前的无符号字节存储指令STRB
图:半字、有符号字节加载指令示例
半字存储指令示例:图:半字存储指令示例
半字、有符号字节字节加载/存储指令码:半字、有符号字节加载存储指令示例:
LDR R1 [R0] ; Load R1 from the address in R0
LDR R8 [R3 #4] ; Load R8 from the address in R3 4
LDR R12 [R13 #-4] ; Load R12 from R13 - 4
STR R2 [R1 #0x100] ; Store R2 to the address in R1 0x100
LDRB R5 [R9] ; Load byte into R5 from R9 ; (zero top 3 bytes)
LDRB R3 [R8 #3] ; Load byte to R3 from R8 3 ; (zero top 3 bytes)
STRB R4 [R10 #0x200] ; Store byte from R4 to R10 0x200
LDR R11 [R1 R2] ; Load R11 from the address in R1 R2
STRB R10 [R7 -R4] ; Store byte from R10 to addr in R7 - R4
LDR R11 [R3 R5 LSL #2] ; Load R11 from R3 (R5 x 4)
LDR R1 [R0 #4]! ; Load R1 from R0 4 then R0 = R0 4
STRB R7 [R6 #-1]! ; Store byte from R7 to R6 - 1 ; then R6 = R6 - 1
LDR R3 [R9] #4 ; Load R3 from R9 then R9 = R9 4
STR R2 [R5] #8 ; Store R2 to R5 then R5 = R5 8
LDR R0 [PC #40] ; Load R0 from PC 0x40 (= address of ; the LDR instruction 8 0x40)
LDR R0 [R1] R2 ; Load R0 from R1 then R1 = R1 R2
LDRH R1 [R0] ; Load halfword to R1 from R0 ; (zero top 2 bytes)
LDRH R8 [R3 #2] ; Load halfword into R8 from R3 2
LDRH R12 [R13 #-6] ; Load halfword into R12 from R13 - 6
STRH R2 [R1 #0x80] ; Store halfword from R2 to R1 0x80
LDRSH R5 [R9] ; Load signed halfword to R5 from R9
LDRSB R3 [R8 #3] ; Load signed byte to R3 from R8 3
LDRSB R4 [R10 #0xC1] ; Load signed byte to R4 from R10 0xC1
LDRH R11 [R1 R2] ; Load halfword into R11 from address ; in R1 R2
STRH R10 [R7 -R4] ; Store halfword from R10 to R7 - R4
LDRSH R1 [R0 #2]! ; Load signed halfword R1 from R0 2 ; then R0 = R0 2