BLOG

Record, summarize, and improve.

arm instructions

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 从不