汇编指令⼤全
以下都是作者在学习IMX6ULL开发板的时候⽤到的指令。
16位数据操作指令
名字 功能
BIC 按位清零(把⼀个数跟另⼀个⽆符号数的反码按位与)
CPS 直接修改CPSR寄存器的bit位。即在特权模式下(除了⽤户模式,剩余的模式都是特权模式),可以通过CPS指令直接修改CPSR寄
存器bit位,让处理器进⼊不同的模式。
例如:cps #0x13 就是把CPSR寄存器的bit4-0更改为0x13,让处理器进⼊SVC模式。
cps #0x12 就是把CPSR寄存器的bit4-0更改为0x12,让处理器进⼊IRQ模式。
POP 从堆栈中弹出若⼲的寄存器的值, 出栈。举个例⼦:
如果我使⽤了pop ax指令后,返回到ax中的数据是5685H。
这时在堆栈段⾥ 5685 还存在吗?堆栈⾥以前存放5685的地⽅还有数据吗?有数据,数据还是5685吗?
答案是:
5685被从栈中弹出,已不再栈中,原本存放5685的地⽅依然存在为5685,但他不再属于栈,5685
所以已不再栈中。
PUSH 进栈
SUB 减法(Subtraction)不带借位的减法指令。——————
ADD 加法
add和sub指令同mov⼀样,都有两个操作对象,它们也可以有以下⼏种形式:
add 寄存器, 数据 add ax,9 把ax中的值加9放到ax中。
add 寄存器, 寄存器 add ax,bx 类似
add 寄存器,内存单元 add ax,[0] 类似
add 内存单元,寄存器 add [0],ax 类似
sub 寄存器, 数据 sub ax,9 把ax中的值减9放到ax中。
sub 寄存器,寄存器
sub 寄存器,内存单元
sub 内存单元,寄存器
MUL 乘法(Multiplication)两个数位数⼀样,即都为8 | 16 | 32位。
乘数和被乘数的⼤⼩必须保持⼀致,乘积的⼤⼩则是它们的⼀倍。这三种类型都可以使⽤寄存器和内存操作数,但不能使⽤⽴即数:由
于⽬的操作数是被乘数和乘数⼤⼩的两倍,因此不会发⽣溢岀。
DIV 除法
CMP ⽐较(Compare,⽐较两个数并且更新标志)
CPY 把⼀个寄存器的值拷贝(COPY)到另⼀个寄存器中
EOR 近位异或
LSL 逻辑左移(Logic Shift Left)
LSR 逻辑右移(Logic Shift Right)
MOV 寄存器加载数据,既能⽤于寄存器间的传输,也能⽤于加载⽴即数
MVN 加载⼀个数的 NOT值(取到逻辑反的值)
NEG 取⼆进制补码
ORR 按位或
ROR 循环右移
SBC 带借位的减法
TST 测试(Test,执⾏按位与操作,并且根据结果更新Z)
REV 在⼀个32位寄存器中反转(Rever)字节序
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位
CMN 负向⽐较(把⼀个数跟另⼀个数据的⼆进制补码相⽐较)
ADC 带进位加法(ADD with Carry)
AND 按位与。这⾥的按位与和C的”&”功能相同
ASR 算术右移(Arithmetic Shift Right)
16位转移指令
名字 功能
B ⽆条件转移(Branch)
B
BL 转移并连接(Link)。⽤于呼叫⼀个⼦程序,返回地址被存储在LR中
CBZ ⽐较(Compare),如果结果为零(Zero)就转移(只能跳到后⾯的指令)
CBNZ ⽐较,如果结果⾮零(Non Zero)就转移(只能跳到后⾯的指令)
IT If-Then
16位存储器数据传送指令
名字 功能
LDR 从存储器中加载(Load)字到⼀个寄存器(Register)中————————————————————————/*已经了解*/
STR 存储指令 把⼀个寄存器按字存储(Store)到存储器中 也就是把寄存器中的数据存储到存储器地址中去 格式:源寄存器 <存 str
储器地址>
str r1,[r2] ; 将r1中的值存到r2所指定的地址中
str r1,[r2,#4] ;将r1中的值存到r2+4所指定的地址中
str r1,[r2],#4 ;将r1中的值存到r2所指定的地址中, 同时r2=r2+4
LDRH 从存储器中加载半(Half)字到⼀个寄存器中
LDRB 从存储器中加载字节(Byte)到⼀个寄存器中
LDRSH 从存储器中加载半字,再经过带符号扩展后存储⼀个寄存器中
LDRSB 从存储器中加载字节,再经过带符号扩展后存储⼀个寄存器中
STRH 把⼀个寄存器存器的低半字存储到存储器中
STRB 把⼀个寄存器的低字节存储到存储器中
LDMIA 加载多个字,并且在加载后⾃增基址寄存器
STMIA 存储多个字,并且在存储后⾃增基址寄存器
PUSH 压⼊多个寄存器到栈中
POP 从栈中弹出多个值到寄存器中
其它16位指令
名字 功能
SVC 系统服务调⽤(Service Call)
BKPT 断点(Break Point)指令。如果调试被使能,则进⼊调试状态(停机)。
NOP ⽆操作(No Operation)
CPSIE 使能 PRIMASK(CPSIE i)/FAULTMASK(CPSIE f)——清零相应的位
CPSID 除能 PRIMASK(CPSID i)/FAULTMASK(CPSID f)——置位相应的位
32位数据操作指令
名字 功能
ADC 带进位加法
ADD 加法
ADDW 宽加法(可以加 12 位⽴即数)
AND 按位与(原⽂是逻辑与,有误——译注)
ASR 算术右移
BIC 位清零(把⼀个数按位取反后,与另⼀个数逻辑与)
BFC 位段清零
BFI 位段插⼊
CMN 负向⽐较(把⼀个数和另⼀个数的⼆进制补码⽐较,并更新标志位)
CMP ⽐较两个数并更新标志位
CLZ 计算前导零的数⽬
EOR 按位异或
LSL 逻辑左移
LSR 逻辑右移
MLA 乘加
MLS 乘减
MOVW 把 16 位⽴即数放到寄存器的底16位,⾼16位清0
MOV 加载16位⽴即数到寄存器(其实汇编器会产⽣MOVW——译注)
MOVT 把 16 位⽴即数放到寄存器的⾼16位,低 16位不影响
MVN 移动⼀个数的补码
MUL 乘法
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 带借位的减法
SUB 减法
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——译注)
32位存储器数据传送指令
名字 功能
LDR 加载字到寄存器
LDRB 加载字节到寄存器
LDRH 加载半字到寄存器
LDRSH 加载半字到寄存器,再带符号扩展到 32位
LDM 从⼀⽚连续的地址空间中加载多个字到若⼲寄存器
LDRD 从连续的地址空间加载双字(64 位整数)到2 个寄存器
STR 存储寄存器中的字
STRB 存储寄存器中的低字节
STRH 存储寄存器中的低半字
STM 存储若⼲寄存器中的字到⼀⽚连续的地址空间中
STRD 存储2 个寄存器组成的双字到连续的地址空间中
PUSH 把若⼲寄存器的值压⼊堆栈中
32位转移指令
名字 功能
B ⽆条件转移
BL 转移并连接(呼叫⼦程序)
TBB 以字节为单位的查表转移。从⼀个字节数组中选⼀个8位前向跳转地址并转移
TBH 以半字为单位的查表转移。从⼀个半字数组中选⼀个16 位前向跳转的地址并转移
其它32位指令
LDREX 加载字到寄存器,并且在内核中标明⼀段地址进⼊了互斥访问状态
LDREXH 加载半字到寄存器,并且在内核中标明⼀段地址进⼊了互斥访问状态
LDREXB 加载字节到寄存器,并且在内核中标明⼀段地址进⼊了互斥访问状态
STREX 检查将要写⼊的地址是否已进⼊了互斥访问状态,如果是则存储寄存器的字
STREXH 检查将要写⼊的地址是否已进⼊了互斥访问状态,如果是则存储寄存器的半字
STREXB 检查将要写⼊的地址是否已进⼊了互斥访问状态,如果是则存储寄存器的字节
CLREX 在本地的处理上清除互斥访问状态的标记(先前由 LDREX/LDREXH/LDREXB做的标记)
MRS 加载特殊功能寄存器的值到通⽤寄存器
MSR 存储通⽤寄存器的值到特殊功能寄存器
NOP ⽆操作
SEV 发送事件
WFE 休眠并且在发⽣事件时被唤醒
WFI 休眠并且在发⽣中断时被唤醒
ISB 指令同步隔离(与流⽔线和 MPU等有关——它会清洗流⽔线,以保证所有它前⾯的指令都执⾏完毕之后,才执⾏它后⾯的指令
DSB 数据同步隔离(与流⽔线、MPU 和cache等有关———也就是 仅当所有在它前⾯的存储器访问操作都执⾏完毕后,才执⾏在它后⾯的
指令(亦即任
何指令都要等待存储器访问操作。)
DMB 数据存储隔离(与流⽔线、MPU 和cache等有关———DMB 指令保证仅当所有在它前⾯的存储器访问操作都执⾏完毕后,才提交
(commit)在它后⾯的存储
器访问操作。)
/**********************************************************************************************************************************/
以上数据是在某位博客园⽹友的基础上加上⾃⼰的⼀个理解之后对具体内容的修改,仅仅属于⾃⼰的⼀个随笔记录,如有侵犯请联系我删
除,⽆意侵犯。
本文发布于:2023-11-06 01:04:52,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/89/1138012.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |