ARM-LDR

作为加载指令  立即偏移: 使用立即偏移量,前置索引立即偏移量,或后置索引立即偏移量加载  语法: LDR{type}{cond} Rt, [Rn {, #offset}] ; 立即偏移 LDR{type}{cond} Rt, [Rn, #offset]! ; 前置索引 LDR{type}{cond} Rt, [Rn], #offset ; 后置索引 LDRD{cond} Rt, Rt2, [Rn {, #offset}] ; immediate offset, doubleword LDRD{cond} Rt, Rt2, [Rn, #offset]! ; pre-indexed, doubleword LDRD{cond} Rt, Rt2, [Rn], #offset ; post-indexed, doubleword PC相对: 加载寄存器,地址是相对PC的一个偏移 语法: LDR{type}{cond}{.W} Rt, label LDRD{cond} Rt, Rt2, label ; Doubleword label是PC相对的表达式 寄存器偏移: 使用寄存器偏移,前置索引寄存器偏移,后置索引寄存器偏移加载 语法: LDR{type}{cond} Rt, [Rn, ±Rm {, shift}] ; register offset LDR{type}{cond} Rt, [Rn, ±Rm {, shift}]! ; pre-indexed ; ARM only LDR{type}{cond} Rt, [Rn], ±Rm {, shift} ; post-indexed ; ARM only LDRD{cond} Rt, Rt2, [Rn, ±Rm] ; register offset, doubleword ; ARM only LDRD{cond} Rt, Rt2, [Rn, ±Rm]! ; pre-indexed, doubleword ; ARM only LDRD{cond} Rt, Rt2, [Rn], ±Rm ; post-indexed, doubleword ; ARM only 寄存器相对: 加载寄存器,地址是相对一个基寄存器的偏移 语法: LDR{type}{cond}{.W} Rt, label LDRD{cond} Rt, Rt2, label ; Doubleword 2.作为伪指令 使用一个32位立即数或地址加载寄存器  语法: LDR{cond}{.W} Rt, =expr LDR{cond}{.W} Rt, =label_expr 使用LCR伪指令时,如果expr的值能被一个有效MOV或MVN指令加载,那么汇编器将使用这条指令; 如果有效MOV或MVN指令无法使用,或者label_expr语法使用了,那么汇编器将把值存放在一个文字池,并且生成一个PC相对的LDR指令从文字池里面读取值。

ARM-B,BL,BX,BLX

B branch,分支,跳转  语法:  B{cond}{.W} label 满足条件跳转到label BL branch with link,带链接的跳转 语法: BL{cond}{.W} label 满足条件跳转到label,并且复制下条指令地址到LR(R14,链接寄存器) BX branch and exchange intruction set,跳转并交换指令集 语法: BX{cond} Rm 满足条件跳转到Rm地址,并且交换指令集,可以根据Rm的bit[0]推导出目标指令集: 如果bit[0]是0,那么处理器跳转到或停留在ARM状态; 如果bit[0]是1,处理器跳转到或停留在Thumb状态; BLX branch with link and exchange instruction set ,带链接的跳转并且交换指令集 语法: BLX{cond}{.W} label BLX{cond} Rm bx和bl指令的组合指令

ARM-ADD

ADD是不带进位的加法指令。 语法: ADD{S}{cond} {Rd}, Rn, Operand2 ADD{cond} {Rd}, Rn, #imm12 ; Thumb, 32-bit encoding only S 可选后缀,如果有,那么条件标示根据操作结果更新 cond 可选条件, Rd 目标寄存器 Rn 存储第一个操作数的寄存器 Operand2 第二个操作数 imm12  0-4095之间的数字 ADD指令吧Rn的值或Operand2或imm12的值相加。 在默写情况下,汇编器可以将一条指令替换为另一条。 Thumb指令中使用PC和SP 通常,我们不能把PC(R15)当Rd,或其他操作数。 例外的是: 可以在32位Thumb ADD指令中,用PC当Rn,0-4095的数当Operand2,并且没有S后缀,这些指令被用来生成PC-relative地址。。在这种情况下,PC值的位[1]读为0,因此计算的基址始终是字对齐的 也可以在16位Thumb ADD{cond} Rd,Rd,Rm 指令中任意寄存器使用PC,but以下16位Thumb指令在ARMv6T2以上弃用了: ADD{cond} PC, SP, PC. ADD{cond} SP, SP, PC. 通常不能用SP(R13)做Rd,或任意操作数,以下除外: 可以在ADD指令中用SP做Rn ADD{cond} SP, SP, SP 可以使用,但是在ARMV6T2过期了 ADD{S}{cond} SP, SP, Rm{,shift} and SUB{S}{cond} SP, SP, Rm{,shift} are permitted if shift is omitted or LSL #1, LSL #2, or LSL … Read more

ARM-ADC

带进位的加法指令(add with carry) 语法: ADC{S}{cond} {Rd}, Rn, Operand2 S 可选后缀,如果定义了S后缀,那么操作标识将根据操作结果更新 Rd 目标寄存器 Rn 保存第一个操作数的寄存器 Operand2 第二个操作数 使用: Rn,Operand2和操作标示相加,即,Rd=Rn+Operand2+carry

ARM-DCB

DCB指令分配一个或多个字节内存,并定义运营时内存内容。 = 是DCB的代名词 语法: {label} DCB expr{,expr}… example: 与C string不同,ARM string是非终止的,如下命令定义非终止c string C_string   DCB  "C_string",0

Arm架构学习

ARM处理器是典型的RISC(精简指令集计算)处理器,实现了加载和存储架构。只有加载和存储指令才能访问内存,数据处理指令只操作寄存器。在实现了ARMV4或更新ARM架构的处理器中,都有32位的寻址范围。 ARM,THUMB和ThumbEE指令集 thumb指令集是ARMV4T之后定义的一种16位指令集,其中大部分32位指令可用,但是有些操作需要更多指令,thumb指令集以性能为代价提供了更好的代码密度。 ARMv6T2通过提供32位Thumb指令对Thumb指令集进行了重大增强。32位和16位Thumb指令共同提供与ARM指令集几乎完全相同的功能。增强的Thumb指令集(Thumb®-2)实现了ARM代码的高性能和更好的代码密度,例如16位Thumb代码。 ARMv7定义了Thumb执行环境(ThumbEE)。ThumbEE指令集基于Thumb,并进行了一些更改和添加,使其成为动态生成代码(即在执行之前或执行期间在设备上编译的代码)更好的目标。 ARM寄存器 在所有ARM处理器中,以下寄存器均可用: 13个通用寄存器R0-R12 1个栈指针(SP)R13 1个链接寄存器(LR)R14 一个程序计数器(PC)R15 1个程序状态寄存器(APSR)