ARM的一些基本功arm汇编 处理器处理能力

文章目录

    • 一些汇编指令
      • 1. 数据传送指令
        • LDR(load register)指令 将内存内容加载入通用寄存器
        • STR(store register)指令 将寄存器内容存入内存中
        • STM和LDM
        • LDP/STP
      • 2. 数据处理指令
        • 逻辑移位
        • 算术移位
        • 数据序反转指令
        • bit手术刀
      • 3. 跳转指令
        • 无条件跳转
          • B (Branch)跳转指令 BX
          • BL(Branch with Link)带返回的连接跳转
        • 条件跳转
          • IT(ARMv7)
          • CSEL CINC CSET(ARMv8)
      • MSR和MRS
    • 处理器处理能力

寻址方式:处理器根据指令中给出的信息来找到指令所需操作数的方式。

ARM寄存器的分类和三种寻址方式讲的很清楚:
https://blog.csdn.net/Sandeldeng/article/details/52954781

间接寻址: 通过 以存储在寄存器上的值为地址去从内存上读数据,汇编中[r0],对应于C语言中的指针 *p。[]

一些汇编指令

知乎大佬直观解释
这篇文章给出列汇编指令的缩写来源,很不错
https://blog.csdn.net/Critisk/article/details/61196190

1. 数据传送指令

LDR(load register)指令 将内存内容加载入通用寄存器

STR(store register)指令 将寄存器内容存入内存中

LDR和STR后面可以接一些后缀,比如"B", "H"和"W"分别表示从给定的内存地址取1个字节,2个字节和4个字节。

  • LDR与MOV的不同:ldr能将数据从内存读到CPU,或者从内存中某处读取到寄存器中,而mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,如 MOV r0,#0是将立即数0放到r0中;
  • MOV是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器。但不是所有立即数都可以传递的,这个立即数要符合一个8位数循环右移偶数位的取值。 立即数需要合法的原因:是,MOV本身就是一条32bit指令,除了指令码本身,它不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示立即数,其中4bit表示移位的位数(循环右移,且数值乘以2),8bit用来表示要移位的一个基数。而对于ldr伪指令,可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如: ldr r0, =0x12345678 这样,就把0x12345678这个地址写到r0中了。ldr伪指令和mov是比较相似,但mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为 mov指令的。

STM和LDM

一个字节一个字节的传送那是“蚂蚁搬家”,如果要复制大批量的数据,效率实在不高,为此ARMv7还提供了用于批量传输的LDM和STM指令,“M"在这里代表Multiple。STM是把多个寄存器的值传送到内存相邻的位置,LDM反之。多个寄存器在ARM汇编语言中用”{}"圈起来,表示待传送的寄存器列表。
ARM的一些基本功arm汇编 处理器处理能力_第1张图片
“!”回写!!!!!
在汇编程序中 !的使用,意思是回写,比如:

ldr r1,[sp, #S_PSR]
ldr lr, [sp, #S_PC]! 

其中 ! 用来控制基址变址寻址的的最终新地址是否进行回写操作。
此条语句的意思是 执行 ldr 之后 sp 被回写成 sp+#S_PC 基址变址寻址的新地址。i++; i+1; 第一个i被改变了类似加!,第二个i没有被改变。

LDP/STP

在ARMv8中,LDM/STM被新一代的指令LDP(Load Pair)和STP(Store Pair)所取代了,
LDM/STM对寄存器列表里包含的寄存器数量并没有什么限制,而LDP/STP要求和内存之间传送数据的寄存器不超过2个。因为"PUSH"和"POP"完全可以用LDM/STM表示,所以他俩也被一并干掉了。两代指令的对应关系大概是这样的:
ARM的一些基本功arm汇编 处理器处理能力_第2张图片

2. 数据处理指令

逻辑移位

将寄存器中存放的内容仅仅视为一串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)之间的转换。
ARM的一些基本功arm汇编 处理器处理能力_第3张图片

bit手术刀

要实现一些更为复杂的位操作,就需要一些更为专业的指令,比如将一个寄存器的部分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的位置。
ARM的一些基本功arm汇编 处理器处理能力_第4张图片

3. 跳转指令

https://zhuanlan.zhihu.com/p/84951062

无条件跳转

B (Branch)跳转指令 BX

跳转指令B使程序无条件跳转到指定的地址执行程序。如果跳转的目标地址不是由立即数直接给出,而是通过寄存器给出,那就应该使用"BX"。
例:B 0x1234 ;跳转到绝对地址0x1234处。

BL(Branch with Link)带返回的连接跳转

暗示接下来的跳转其实是一个子函数调用
BL指令用于实现子程序调用。子程序的返回可通过将LR寄存器的值复制到PC寄存器来实现。
例:BL func ;跳转到子程序func处执行,同时将当前pc值保存到LR中。

条件跳转

IT(ARMv7)

ARMv7专门推出了长的和高级语言的关键字很像的"IF‐THEN(IT)",这已经不是一条单独的指令了,而是一个指令块(IT blocks)。

CSEL CINC CSET(ARMv8)

ARMv8

MSR和MRS

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万条指令。

你可能感兴趣的:(嵌入式Linux)