常用的arm汇编指令(2)

1.对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS主要是定义了函数呼叫时参数的传递规则以及如何从函数返回。

2.简单ATPCS寄存器的使用规则:
(1). 子程序通过寄存器R0~R3来传递参数. 这时寄存器可以记作: A0~A3 , 被调用的子程序在返回前无需恢复寄存器R0~R3的内容.
(2). 在子程序中,使用R4~R11来保存局部变量,这时寄存器R4~R11可以记作: V1~V8 .如果在子程序中使用到V1~V8的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作.在THUMB程序中,通常只能使用寄存器R4~R7来保存局部变量.
(3).寄存器R12用作子程序间scratch寄存器,记作ip; 在子程序的连接代码段中经常会有这种使用规则.
(4). 寄存器R13用作数据栈指针,记做SP,在子程序中寄存器R13不能用做其他用途. 寄存器SP在进入子程序时的值和退出子程序时的值必须相等.
(5). 寄存器R14用作连接寄存器,记作lr ; 它用于保存子程序的返回地址,如果在子程序中保存了返回地址,则R14可用作其它的用途.
(6). 寄存器R15是程序计数器,记作PC ; 它不能用作其他用途.
(7). ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的.

3.子程序结果返回规则
(1).结果为一个32位的整数时,可以通过寄存器R0返回.
(2).结果为一个64位整数时,可以通过R0和R1返回,依此类推.
(3).结果为一个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回.
(4).结果为一个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回.
(5).对于位数更多的结果,需要通过调用内存来传递.

4.无符号数与有符号数比较时,要将有符号数转化为无符号数,再来比较。机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样,如果机器数是负数,
   则该机器数的补码是对它的原码(除符号位以外)各位依次取反,并在末位加1而得到的!

5.BMI若N标志置1,则转移.if(a) 就是说a 的值不为0就成立

6.16位数据操作指令
名字 功能
ADC  带进位加法(ADD with Carry)
AND  按位与。这里的按位与和C的”&”功能相同
ASR  算术右移(Arithmetic Shift Right)
BIC  按位清零(把一个数跟另一个无符号数的反码按位与)
CMN  负向比较(把一个数跟另一个数据的二进制补码相比较)
CPY  把一个寄存器的值拷贝(COPY)到另一个寄存器中
EOR  近位异或
LSL  逻辑左移(Logic Shift Left)
MUL  乘法(Multiplication)
MVN  加载一个数的 NOT值(取到逻辑反的值)
NEG  取二进制补码
ORR  按位或
ROR  循环右移
SBC  带借位的减法
SUB  减法(Subtraction)
TST  测试(Test,执行按位与操作,并且根据结果更新Z)
REV  在一个32位寄存器中反转(Reverse)字节序
REVH  把一个32位寄存器分成两个(Half)16位数,在每个16位数中反转字节序
REVSH  把一个32位寄存器的低16位半字进行字节反转,然后带符号扩展到32位
SXTB  带符号(Signed)扩展一个字节(Byte)到 32位
SXTH  带符号(Signed)扩展一个半字(Half)到 32位
UXTB  无符号(Unsigned)扩展一个字节(Byte)到 32位
UXTH  无符号(Unsigned)扩展一个半字(Half)到 32位

7.16位转移指令
名字 功能
B  有条件(Condition)转移
BL  转移并连接(Link)。用于呼叫一个子程序,返回地址被存储在LR中
CBZ  比较(Compare),如果结果为零(Zero)就转移(只能跳到后面的指令)
CBNZ  比较,如果结果非零(Non Zero)就转移(只能跳到后面的指令)
IT  If-Then

8.16位存储器数据传送指令
名字 功能
LDR  从存储器中加载(Load)字到一个寄存器(Register)中
LDRSH  从存储器中加载半字,再经过带符号扩展后存储一个寄存器中
LDRSB  从存储器中加载字节,再经过带符号扩展后存储一个寄存器中
STR  把一个寄存器按字存储(Store)到存储器中
LDMIA  加载多个字,并且在加载后自增基址寄存器
STMIA  存储多个字,并且在存储后自增基址寄存器

9.其它16位指令
名字 功能
SVC  系统服务调用(Service Call)
BKPT  断点(Break Point)指令。如果调试被使能,则进入调试状态(停机)。
NOP  无操作(No Operation)
CPSIE  使能 PRIMASK(CPSIE i)/FAULTMASK(CPSIE f)——清零相应的位
CPSID  除能 PRIMASK(CPSID i)/FAULTMASK(CPSID f)——置位相应的位

10.32位数据操作指令
名字 功能
ADC  带进位加法
ADDW  宽加法(可以加 12 位立即数)
AND  按位与(原文是逻辑与,有误——译注)
ASR  算术右移
BIC  位清零(把一个数按位取反后,与另一个数逻辑与)
BFC  位段清零
BFI  位段插入
CMN  负向比较(把一个数和另一个数的二进制补码比较,并更新标志位)
CMP  比较两个数并更新标志位
CLZ  计算前导零的数目
EOR  按位异或
MLA  乘加
MLS  乘减
MOVW  把 16 位立即数放到寄存器的底16位,高16位清0
MOVT  把 16 位立即数放到寄存器的高16位,低 16位不影响
MVN  移动一个数的补码

ORR  按位或(原文为逻辑或,有误——译注)
ORN  把源操作数按位取反后,再执行按位或(原文为逻辑或,有误——译注)
RBIT  位反转(把一个 32 位整数先用2 进制表达,再旋转180度——译注)
REV  对一个32 位整数做按字节反转
REVH/REV16 对一个32 位整数的高低半字都执行字节反转
REVSH  对一个32 位整数的低半字执行字节反转,再带符号扩展成32位数
ROR  圆圈右移
RRX  带进位的逻辑右移一格(最高位用C 填充,且不影响C的值——译注)
SFBX  从一个32 位整数中提取任意的位段,并且带符号扩展成 32 位整数
SDIV  带符号除法
SMLAL  带符号长乘加(两个带符号的 32 位整数相乘得到 64 位的带符号积,再把积加到另一个带符号 64位整数中)
SMULL  带符号长乘法(两个带符号的 32 位整数相乘得到 64位的带符号积)
SSAT  带符号的饱和运算
SBC  带借位的减法

SUBW  宽减法,可以减 12 位立即数
SXTB  字节带符号扩展到32位数
TEQ  测试是否相等(对两个数执行异或,更新标志但不存储结果)
TST  测试(对两个数执行按位与,更新Z 标志但不存储结果)
UBFX  无符号位段提取
UDIV  无符号除法
UMLAL  无符号长乘加(两个无符号的 32 位整数相乘得到 64 位的无符号积,再把积加到另一个无符号 64位整数中)
UMULL  无符号长乘法(两个无符号的 32 位整数相乘得到 64位的无符号积)
USAT  无符号饱和操作(但是源操作数是带符号的——译注)
UXTB  字节被无符号扩展到32 位(高24位清0——译注)
UXTH  半字被无符号扩展到32 位(高16位清0——译注)

11.32位存储器数据传送指令
名字 功能
LDM  从一片连续的地址空间中加载多个字到若干寄存器
LDRD  从连续的地址空间加载双字(64 位整数)到2 个寄存器
STR  存储寄存器中的字
STM  存储若干寄存器中的字到一片连续的地址空间中
STRD  存储2 个寄存器组成的双字到连续的地址空间中

12.32位转移指令
名字 功能
BL  转移并连接(呼叫子程序)
TBB  以字节为单位的查表转移。从一个字节数组中选一个8位前向跳转地址并转移
TBH  以半字为单位的查表转移。从一个半字数组中选一个16 位前向跳转的地址并转移

13.其它32位指令
LDREX  加载字到寄存器,并且在内核中标明一段地址进入了互斥访问状态
LDREXH  加载半字到寄存器,并且在内核中标明一段地址进入了互斥访问状态
LDREXB  加载字节到寄存器,并且在内核中标明一段地址进入了互斥访问状态
STREX  检查将要写入的地址是否已进入了互斥访问状态,如果是则存储寄存器的字
STREXH  检查将要写入的地址是否已进入了互斥访问状态,如果是则存储寄存器的半字
STREXB  检查将要写入的地址是否已进入了互斥访问状态,如果是则存储寄存器的字节
CLREX  在本地的处理上清除互斥访问状态的标记(先前由 LDREX/LDREXH/LDREXB做的标记)
MRS  加载特殊功能寄存器的值到通用寄存器
MSR  存储通用寄存器的值到特殊功能寄存器

SEV  发送事件
WFE  休眠并且在发生事件时被唤醒
WFI  休眠并且在发生中断时被唤醒
ISB  指令同步隔离(与流水线和 MPU等有关——译注)
DSB  数据同步隔离(与流水线、MPU 和cache等有关——译注)
DMB  数据存储隔离








你可能感兴趣的:(命令与ARM汇编)