MOV
MOVT 可以将0x0000到0xFFFF范围内的任何值加载到寄存器的最高有效部分,而不会改变最低有效部分的内容
MOV32 伪指令(相当与MOV+MOVT)
MVN 加载这些值的按位补码(‑(n+1))
LDR rn, =0xdddddddd 伪指令(可以寻址超出MOV、MVN范围的数据),在 A32 或 T32 代码中寻址小于 4KB,LDR rn, _start 将_start中的数据加载到rn
LTORG 当超出LDR寻址范围时,需要在LDR寻址范围内构建一个文字池用于保存LDR加载的常量
AREA 指定ELF 部分,标记节的开始
ENTRY 声明程序的入口点,标记要执行的第一条指令
END 程序结束
SPACE 保留一个归零的内存块
FILL 保留一块内存来填充给定的值
加载地址到寄存器:
ADR 加载与PC的相对地址到寄存器,与ADR一起使用的标签必须在同一代码段内
ADRL 加载与PC的相对地址到寄存器,比ADR指令范围更广
MOV32 MOV与MOVT指令的组合
LDR rn, =Label 将Label地址加入到rn
EQU 为符号赋予值
DCD 声明一个或多个word用于存储数据
DCW 声明一个或多个16位用于存储数据
DCB 声明一个或多个byte用于存储数据
LDR pc, [r3,r0,LSL#2] pc=r3+r0×4
LDRB r2,[r1],#1 将R1指向的地址的内容加载到R2中,然后将R1加1
LDM 加载多个寄存器
STM 存储多个寄存器
PUSH 传输后递减
POP 传输后递增
面向堆栈的后缀和等效寻址模式后缀
| 面向堆栈的后缀 | 用于store or push指令 | 用于load or pop指令 |
| FD(完全降序堆栈) | DB(递减之前) | IA(之后递增) |
| FA(全升序堆栈) | IB(之前增量) | DA(之后递减) |
| ED(空降序堆栈) | DA(之后递减) | IB(之前增量) |
| EA(空升序堆栈) | IA(之后递增) | DB(之前递减) |
加载和存储多条指令的后缀
| 堆栈类型 | store | load |
| 全降 | STMFD(STMDB之前递减) | LDMFD(LDM之后递增) |
| 完全上升 | STMFA(STMIB之前递增) | LDMFA(LDMDA之后递减) |
| 空降 | STMED (STMDA,之后递减) | LDMED (LDMIB之前递增) |
| 空升 | STMEA(STM后递增) | LDMEA(LDMDB递减之前) |
内存访问
Offset寻址
[Rn,offset] 从基址寄存器获得的地址,结果用作内存访问的地址,基址寄存器不变
Pre-indexed寻址
[Rn,offset]! 从基址寄存器获得地址,结果用作内存访问的地址并写回基址寄存器
Post-indexed寻址
[Rn],offset 从基址寄存器获得的地址不变地用作存储器访问的地址,偏移值应用于地址并写回基址寄存器
offset可以是:
- 立即数
- Rm
- Rm , LSL #shift
RMW
BIC 将指定位清零
ORR 将指定位置1
VMSR r10,FPSCR 将系统寄存器复制到r10
MARCO 宏
MEND
arm asm指令列表
| ALIAS | EQU | LTORG |
| ALIGN | EXPORT or GLOBAL | MACRO and MEND |
| ARM or CODE32 | EXPORTAS | MAP |
| AREA | EXTERN | MEND (see MACRO) |
| ASSERT | FIELD | MEXIT |
| ATTR | FRAME ADDRESS | NOFP |
| CN | FRAME POP | OPT |
| CODE16 | FRAME PUSH | PRESERVE8 (see REQUIRE8) |
| COMMON | FRAME REGISTER | PROC see FUNCTION |
| CP | FRAME RESTORE | RELOC |
| DATA | FRAME SAVE | REQUIRE |
| DCB | FRAME STATE REMEMBER | REQUIRE8 and PRESERVE8 |
| DCD and DCDU | FRAME STATE RESTORE | RLIST |
| DCDO | FRAME UNWIND ON or OFF | RN |
| DCFD and DCFDU | FUNCTION or PROC | ROUT |
| DCFS and DCFSU | GBLA, GBLL, and GBLS | SETA, SETL, and SETS |
| DCI | GET or INCLUDE | SN |
| DCQ and DCQU | GLOBAL (see EXPORT) | SPACE or FILL |
| DCW and DCWU | IF, ELSE, ENDIF, and ELIF | SUBT |
| DN | IMPORT | THUMB |
| ELIF, ELSE (see IF) | INCBIN | TTL |
| END | INCLUDE see GET | WHILE and WEND |
| ENDFUNC or ENDP | INFO | WN and XN |
| ENDIF (see IF) | KEEP | |
| ENTRY | LCLA, LCLL, and LCLS |
EQ 设置 Z 等于
NE 清除 Z 不等于
CS 或 HS 设置 C 大于或等于(无符号 >=)
CC 或 LO 清除 C 小于(无符号 <)
MI 设置 N 负数
PL 清除 N 正数或零
VS 设置 V 溢出
VC 清除 V 无溢出
HI 设置 C 并清除 Z 大于(无符号 >)
LS 清除 C 或设置 Z 小于或等于(无符号 <=)
GE N 与 V 相同有符号 >=
LT N 与 V 不同有符号 <
GT 清除 Z,N 与 V 相同有符号 >
LE 设置 Z,N 与 V 不同有符号 <=
AL 任何始终。 通常会忽略此后缀。
NV 从不