×
单片机 > 单片机程序设计 > 详情

常用ARM指令集及汇编

发布时间:2020-08-26 发布时间:
|
一、ARM处理器的寻址方式

二、指令集学习

(一) ARM指令集

1. 指令格式

2. 条件码

3. ARM存储器访问指令

1) LDR/ STR-加载/ 存储指令

2) LDM/ STM-多寄存器加载/ 存储指令

3) SWP-寄存器和存储器交换指令

4. ARM数据处理指令

1) 数据传送指令

a) MOV-数据传送指令

b) MVN-数据非传送指令

2) 算术逻辑运算指令

a) ADD-加法运算指令

b) SUB-减法运算指令

c) RSB-逆向减法指令

d) ADC-带进位加法指令

e) SBC-带进位减法指令

f) RSC-带进位逆向减法指令

g) AND-逻辑“与”

h) ORR-逻辑“或”

i) EOR-逻辑“异或”

j) BIC-位清除指令

3) 比较指令

a) CMP-比较指令

b) CMN-负数比较指令

c) TST-位测试指令

d) TEQ-相等测试指令

4) 乘法指令

a) MUL-32位乘法指令

b) MLA-32位乘加指令

c) UMULL-64位无符号乘法指令

d) UMLAL-64位无符号乘加指令

e) SMULL-64位有符号乘法指令

f) SMLAL-64位有符号乘加指令

5. ARM分支指令

1) B-分支指令

2) BL-带连接的分支指令

3) BX-带状态切换的分支指令

6. ARM协处理器指令

1) CDP-协处理器数据操作指令

2) LDC-协处理器数据读取指令

3) STC-协处理器数据写入指令

4) MCR-ARM处理器到协处理器的数据传送指令

5) MRC-协处理器到ARM处理器的数据传送指令

7. ARM杂项指令

1) SWI-软中断指令

2) MRS-读状态寄存器指令

3) MSR-写状态寄存器指令

8. ARM伪指令

1) ADR-小范围的地址读取伪指令

2) ADRL-中等范围的地址读取伪指令

3) LDR-大范围的地址读取伪指令

4) NOP-空操作伪指令

(二) Thumb指令集

1. Thumb指令集和ARM指令集的区别

2. Thumb存储器访问指令

1) LDR/ STR-加载/ 存储指令

2) PUSH/ POP-寄存器入栈 / 出栈指令

3) LDMIA/ STMIA-多寄存器加载/ 存储指令

3. Thumb数据处理指令

1) 数据传送指令

a) MOV-数据传送指令

b) MVN-数据非传送指令

c) NEG-数据取负指令

2) 算术逻辑运算指令

a) ADD-加法运算指令

b) SUB-减法运算指令

c) ADC-带进位加法指令

d) SBC-带进位减法指令

e) MUL-乘法运算指令

f) AND-逻辑“与”

g) ORR-逻辑“或”

h) EOR-逻辑“异或”

i) BIC-位清除指令

j) ASR-算术右移指令

k) LSL-逻辑左移指令

l) LSR-逻辑右移指令

m) ROR-循环右移指令

3) 比较指令

a) CMP-比较指令

b) CMN-负数比较指令

c) TST-位测试指令

4. Thumb分支指令

1) B-分支指令

2) BL-带连接的分支指令

3) BX-带状态切换的分支指令

5. Thumb杂项指令

1) SWI-软中断指令

6. Thumb伪指令

1) ADR-小范围的地址读取伪指令

2) LDR-大范围的地址读取伪指令

3) NOP-空操作伪指令

7。汇编指令API

MOV(MOVe)   传送指令
PUSH     入栈指令
POP     出栈指令
XCHG(eXCHanG)   交换指令
XLAT(TRANSLATE)   换码指令
LEA (Load Effective Address) 有效地址送寄存器指令
LDS(Load DS with pointer) 指针送寄存器和DS指令
LES(Load ES with pointer) 指针送寄存器和ES指令
LAHF(Load AH with Flags) 标志位送AH指令
SAHF(Store AH into Flgs) AH送标志寄存器指令
PUSHF(PUSH the Flags)   标志进栈指令
POPF(POP the Flags)   标志出栈指令
ADD     加法指令
ADC     带进位加法指令
INC     加1指令
SUB(SUBtract)   不带借位的减法指令
SBB(SuVtrach with borrow) 带借位的减法指令
DEC(DECrement)   减1指领
NEG(NEGate)   求补指令
CMP(CoMPare)   比较指令
MUL(unsinged MULtiple) 无符号数乘法指令
IMUL(sIgned MUL tiple) 有符号数乘法指令
DIV(unsigned DIVide)   无符号数除法指令
IDIV(sIgned DIVide)   有符号数除法指令
CBW(Count Byte to Word) 字节转换为字指令
CWD(Count Word to Doble word) 字转换为双字指令
DAA   压缩的BCD码加法十进制调整指令
DAS   压缩的BCD码减法十进制调整指令
AAA   非压缩的BCD码加法十进制调整指令
AAS   非压缩的BCD码加法十进制调整指令
AND     逻辑与指令
OR     逻辑或指令
XOR     逻辑异或指令
NOT     逻辑非指令
TEST     测试指令
SHL(SHift logical Letf)   逻辑左移指令
SHR(SHift logical Right)   逻辑右移指令
ROL(Rotate Left )   循环左移指令P58
ROR(Rotate Right)   循环右移指令P58
RCL(Rotate Left through Carry) 带进位循环左移
RCR(Rotate Right through Carry) 带进位循环左移
MOVS(MOVe String)   串传送指令
STOS(STOre into String) 存入串指令
LODS(LOad from string) 从串取指令
REP(REPeat)   重复操作前
CLD(CLear Direction flag) 清除方向标志指令
STD(SeT Direction flag)   设置方向标志指令
CMPS(CoMPare String)   串比较指令
SCAS(SCAn String)   串扫描指令
REPE/REPZ(REPeat while Equal/Zero)相等/为零时重复操作前缀
REPNE/REPNZ(REPeat while Not Equal/Zero)不相等/不为零进重复前缀
IN(INput)   输入指令
OUT(OUTput)   输出指令
JMP(JuMP)   无条件转移指令
JZ,JNZ,JS,JNS,JO,JNO,JP,JNP,JB,JNB,JBE,JNBE,JL,JNL,JLE,JNLE,JCXZ   条件转移指令
LOOP     循环指令P70
LOOPZ/LOOPE   为零/相等时循环指令
LOOPNZ/LOOPNE   不为零/不相等时循环指令
CALL     子程序调用指令
RET(RETun)   子程序返回指令
CLC(CLear Carry)   进位位置0指令
CMC(CoMplement Carry) 进位位求反指令
SRC(SeT Carry)   进位位置1指令
NOP(No OPeretion)   无操作指令
HLT(HaLT)   停机指令
OFFSET   返回偏移地址
SEG     返回段地址
EQU(=)   等值语句
PURGE   解除语句
DUP     操作数字段用操作符
SEGMENT,ENDS   段定义指令
ASSUME   段地址分配指令
ORG     起始偏移地址设置指令
$     地址计数器的当前值
PROC,ENDP   过程定义语句
NAME,TITLE,END   程序开始结束语句
MACRO,ENDM   宏定义指令

JZ   OPR //结果为零转移 
JNZ   OPR //结果不为零转移 
JS   OPR //结果为负转移 
JNS   OPR //结果为正转移 
JO   OPR //溢出转移
JNO   OPR //不溢出转移 
JP   OPR //结果为偶转移
JNP   OPR //结果为奇转移 
JC   OPR //有进位转移 
JNC   OPR //无进位转移



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机RAM使用