一、ARM介绍
1) arm汇编中,程序下一步执行哪一条指令,是根据程序计数器(PC)的值来决定。
类比于8086的CS:IP的功能。
2) 8086属于CISC(复杂指令集),每条指令长度不等,arm是RISC(精简指令集),所有指令等长(例如都为32位)。
3)ARM指令代码一般分为5个区域:
第1个域是4位[31-28]的条件码域
第2个域是[27-20],除了指令编码外,还包含几个很重要的指令特征和可选后缀的编码
第3个域是地址基址,是4位[19-16],为R0-R15共16个寄存器编码
第4个域是目标或源寄存器Rd,是4位[15:12],为R0-R15共16个寄存器编码
第5个域是地址偏移或操作寄存器、操作数区[11-0]。
ARM指令代码格式
<opcode>{<cond>}{S}<Rd>,<Rn>{,<OP2>}
格式中<>的内容必不可少,{}中的内容可省略
<opcode>是操作码,如ADD表示算数加法
{<cond>}表示指令执行的条件域,如EQ、NE等。
{S}决定指令的执行结果是否影响CPSR的值,使用该后缀则指令执行的结果影响CPSR的值,否则不影响
<Rd>表示目的寄存器
<Rn>表示第一个操作数,为寄存器
<op2>表示第二个操作数,可以是立即数、寄存器或寄存器移位操作数。
4)指令的可选后缀
指令中使用"S"后缀时,指令执行后程序状态寄存器的条件标志位将被刷新;不使用"S"后缀时,指令执行后程序状态寄存器的条件标志将不会发生变化。
如果指令地址表达式中不含"!"后缀,则基址寄存器的地址值不会发生变化。指令中的地址表达式中含有"!"后缀时,指令执行后,基址寄存器中的地址值将发生变化,变化的结果如下:
基址寄存器中的值(指令执行后) = 指令执行前的值 + 地址偏移量