ARM微处理器共有37个32位寄存器,其中31个
为通用寄存器,6个为状态寄存器。但是这些寄
存器不能被同时访问,具体哪些寄存器是可以访
问的,取决ARM处理器的工作状态及具体的运行
模式。但在任何时候,通用寄存器R14~R0、程
序计数器PC、一个状态寄存器都是可访问的。
在ARM工作状态下,任一时刻可以访问16
个通用寄存器和一到两个状态寄存器。在
非用户模式(特权模式)下,则可访问到
特定模式分组寄存器,具体见下页图:
Thumb状态下的寄存器集是ARM状态下
寄存器集的一个子集,程序可以直接访
问8个通用寄存器(R7~R0)、程序计
数器(PC)、堆栈指针(SP)、连接寄
存器(LR)和CPSR。具体见下页图:
Thumb状态下的寄存器组织与ARM状态下的寄存器组织的
关系:
Thumb状态下和ARM状态下的R0~R7是相同的。
Thumb状态下和ARM状态下的CPSR和SPSR是相同的。
Thumb状态下的SP对应于ARM状态下的R13。
Thumb状态下的LR对应于ARM状态下的R14。
Thumb状态下的程序计数器PC对应于ARM状态下R15。
寄存器对应:
通用寄存器
R0~R15
R13_svc、R14_svc
R13_abt、R14_abt
R13_und、R14_und
R13_irq、R14_irq
R8_fiq ~R14_fiq
不分组寄存器(The unbanked registers)
R0-R7
分组寄存器(The banked registers)
R8-R14
程序计数器:R15(PC)
R0-R7是不分组寄存器。这意味着在所有处
理器模式下,访问的都是同一个物理寄存
器。未分组寄存器没有被系统用于特别的用
途,任何可采用通用寄存器的应用场合都可
以使用未分组寄存器。
分组寄存器R8-R12
1. FIQ模式分组寄存器R8-R12
2. FIQ以外的分组寄存器R8-R12
分组寄存器R13、R14
1. 寄存器R13通常用做堆栈指针SP
2. 寄存器R14用作子程序链接寄存器(Link
Register-LR),也称为LR,指向函数的返回
地址
程序计数器
寄存器R15被用作程序计数器,也称为
PC 。其值等于当前正在执行的指令的地
址+8(因为在取址和执行之间多了一个译码
的阶段)。
ARM寄存器的别名:
R0-R3 a1-a4
R4-R11 v1-v8
R10- sl SL
R11- fp FP
R12- ip IP
R13- sp SP
R14- lr LR
R15- pc PC
.byte1字节
.short2字节
.word 4字节
.asciz ASSIC码字符(末尾加\0)
.ascii ASSIC码字符(末尾不加\0)
----------------------------------------------------
----------------------------------------------------
汇编指令集:
1.通用数据传送指令.
MOV----> move
MOVSX---->extended move with sign data
MOVZX---->extended move with zero data
PUSH---->push
POP---->pop
PUSHA---->push all
POPA---->pop all
PUSHAD---->push all data
POPAD---->pop all data
BSWAP---->byte swap
XCHG---->exchange
CMPXCHG---->compare and change
XADD---->exchange and add
XLAT---->translate
2.输入输出端口传送指令.
IN---->input
OUT---->output
3.目的地址传送指令.
-----------------------------------
LEA---->load effective address
LDS---->load DS
LES---->load ES
LFS---->load FS
LGS---->load GS
LSS---->load SS
4.标志传送指令.
LAHF---->load AH from flag
SAHF---->save AH to flag
PUSHF---->push flag
POPF---->pop flag
PUSHD---->push dflag
POPD---->pop dflag
二、算术运算指令
----------------------------------
ADD---->add
ADC---->add with carry
INC---->increase 1
AAA---->ascii add with adjust
DAA---->decimal add with adjust
SUB---->substract
SBB---->substract with borrow
DEC---->decrease 1
NEC---->negative
CMP---->compare
AAS---->ascii adjust on substract
DAS---->decimal adjust on substract
MUL---->multiplication
IMUL---->integer multiplication
AAM---->ascii adjust on multiplication
DIV---->divide
IDIV---->integer divide
AAD---->ascii adjust on divide
CBW---->change byte to word
CWD---->change word to double word
CWDE---->change word to double word with sign to EAX
CDQ---->change double word to quadrate word
三、逻辑运算指令
----------------------------------
AND---->and
OR---->or
XOR---->xor
NOT---->not
TEST---->test
SHL---->shift left
SAL---->arithmatic shift left
SHR---->shift right
SAR---->arithmatic shift right
ROL---->rotate left
ROR---->rotate right
RCL---->rotate left with carry
RCR---->rotate right with carry
四、串指令
--------------------------------
MOVS---->move string
CMPS---->compare string
SCAS---->scan string
LODS---->load string
STOS---->store string
REP---->repeat
REPE---->repeat when equal
REPZ---->repeat when zero flag
REPNE---->repeat when not equal
REPNZ---->repeat when zero flag
REPC---->repeat when carry flag
REPNC---->repeat when not carry flag
五、程序转移指令
------------------------
1>无条件转移指令(长转移)
JMP---->jump
CALL---->call
RET---->return
RETF---->return far
2>条件转移指令(短转移,-128到+127的距离内)
JAE---->jump when above or equal
JNB---->jump when not below
JB---->jump when below
JNAE---->jump when not above or equal
JBE---->jump when below or equal
JNA---->jump when not above
JG---->jump when greater
JNLE---->jump when not less or equal
JGE---->jump when greater or equal
JNL---->jump when not less
JL---->jump when less
JNGE---->jump when not greater or equal
JLE---->jump when less or equal
JNG---->jump when not greater
JE---->jump when equal
JZ---->jump when has zero flag
JNE---->jump when not equal
JNZ---->jump when not has zero flag
JC---->jump when has carry flag
JNC---->jump when not has carry flag
JNO---->jump when not has overflow flag
JNP---->jump when not has parity flag
JPO---->jump when parity flag is odd
JNS---->jump when not has sign flag
JO---->jump when has overflow flag
JP---->jump when has parity flag
JPE---->jump when parity flag is even
JS---->jump when has sign flag
3>循环控制指令(短转移)
LOOP---->loop
LOOPE---->loop equal
LOOPZ---->loop zero
LOOPNE---->loop not equal
LOOPNZ---->loop not zero
JCXZ---->jump when CX is zero
JECXZ---->jump when ECX is zero
4>中断指令
INT---->interrupt
INTO---->overflow interrupt
IRET---->interrupt return
5>处理器控制指令
HLT---->halt
WAIT---->wait
ESC---->escape
LOCK---->lock
NOP---->no operation
STC---->set carry
CLC---->clear carry
CMC---->carry make change
STD---->set direction
CLD---->clear direction
STI---->set interrupt
CLI---->clear interrupt
六、伪指令
─────────────────────────────────────
DW---->definw word
PROC---->procedure
ENDP---->end of procedure
SEGMENT---->segment
ASSUME---->assume
ENDS---->end segment
END---->end