寻址方式:处理器根据指令中给出的信息来找到指令所需操作数的方式。
ARM寄存器的分类和三种寻址方式讲的很清楚:
https://blog.csdn.net/Sandeldeng/article/details/52954781
间接寻址: 通过 以存储在寄存器上的值为地址去从内存上读数据,汇编中[r0],对应于C语言中的指针 *p。[]
知乎大佬直观解释
这篇文章给出列汇编指令的缩写来源,很不错
https://blog.csdn.net/Critisk/article/details/61196190
LDR和STR后面可以接一些后缀,比如"B", "H"和"W"分别表示从给定的内存地址取1个字节,2个字节和4个字节。
一个字节一个字节的传送那是“蚂蚁搬家”,如果要复制大批量的数据,效率实在不高,为此ARMv7还提供了用于批量传输的LDM和STM指令,“M"在这里代表Multiple。STM是把多个寄存器的值传送到内存相邻的位置,LDM反之。多个寄存器在ARM汇编语言中用”{}"圈起来,表示待传送的寄存器列表。
“!”回写!!!!!
在汇编程序中 !的使用,意思是回写,比如:
ldr r1,[sp, #S_PSR]
ldr lr, [sp, #S_PC]!
其中 ! 用来控制基址变址寻址的的最终新地址是否进行回写操作。
此条语句的意思是 执行 ldr 之后 sp 被回写成 sp+#S_PC 基址变址寻址的新地址。i++; i+1;
第一个i被改变了类似加!,第二个i没有被改变。
在ARMv8中,LDM/STM被新一代的指令LDP(Load Pair)和STP(Store Pair)所取代了,
LDM/STM对寄存器列表里包含的寄存器数量并没有什么限制,而LDP/STP要求和内存之间传送数据的寄存器不超过2个。因为"PUSH"和"POP"完全可以用LDM/STM表示,所以他俩也被一并干掉了。两代指令的对应关系大概是这样的:
将寄存器中存放的内容仅仅视为一串bits
LSL - Logical Shift Left
LSR - Logical Shift Righ
ROR(Rotate Right)
无循环左移指令
将寄存器中存放的内容视作一个数值,移位的时候就需要考虑数值的正负问题。
ARM中,只有算术右移(ASR - Arithmetic shift right)指令
每右移一位的结果相当于除以2。
“数据序转”是指将寄存器中的bits或bytes进行部分交换,交换的形式有很多种,包括反转所有bits的RBIT指令,反转所有bytes的REV指令,在两个16位的half word中分别反转bytes的REV16指令。64位系统中还有REV32。
其中REV指令应该是用的最多的,因为它可以用于网络传输中Little-Endian(LE)和Big-Endian(BE)之间的转换。
要实现一些更为复杂的位操作,就需要一些更为专业的指令,比如将一个寄存器的部分bits插入另一个寄存器的指定部分的BFI(Bit Field Insert)指令,
或者将这些bits直接提取出来的BFX(Bit Field Extract)指令,还有将指定部分的bits清零的BFC(Bit Field Clear)指令。
比如"BFI W0, W1, #9, #6"就是将W1寄存器LSB端的6个bits插入到W0寄存器从bit 9到bit 14的位置。
https://zhuanlan.zhihu.com/p/84951062
跳转指令B使程序无条件跳转到指定的地址执行程序。如果跳转的目标地址不是由立即数直接给出,而是通过寄存器给出,那就应该使用"BX"。
例:B 0x1234 ;跳转到绝对地址0x1234处。
暗示接下来的跳转其实是一个子函数调用
BL指令用于实现子程序调用。子程序的返回可通过将LR寄存器的值复制到PC寄存器来实现。
例:BL func ;跳转到子程序func处执行,同时将当前pc值保存到LR中。
ARMv7专门推出了长的和高级语言的关键字很像的"IF‐THEN(IT)",这已经不是一条单独的指令了,而是一个指令块(IT blocks)。
ARMv8
MRS 指令: 对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以获得当前处理器的工作状态。读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有SPSR寄存器)。
MSR指令: 对状态寄存器CPSR和SPSR进行写操作。与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。
一般从汇编指令的角度去看,从两个方面回答 时钟频率和处理速度。
ARM9处理能力1.1MIPS/MHz。
在时钟频率为1MHz的情况下,一秒钟处理110万条指令。(110万1100000)。
也就是说,时钟频率每增加1MHz,1秒钟就能多处理110万条指令。