ARM汇编指令
学习arm汇编的主要目的是为了编写arm启动代码,启动代码启动以后,引导程序到c语言环境下允许。换句话说启动代码的目的是为了在处理器复位以后搭建c语言最基本的需求。因此启动代码的主要任务有:
初始化异常向量表;
初始化各工作模式的栈指针寄存器;
开启arm内核中断允许;
将工作模式设置为user模式;
完成上述工作后,引导程序进入c语言主函数执行;
首先我们先学一些指令
mov指令
mov指令:加载12位立即数到寄存器或转移一个寄存器的值到另外一个寄存器
mov r0, #2 ;加载立即数2到寄存器r0,MOV{S}<c> <Rd>, #<const>
mov r1, r0 ;将r0寄存器的值加载到r1,MOV{S}<c> <Rd>, <Rm>
可以看到,寄存器R0=0x00000002,R1=0x00000002
Rd是目标寄存器,Rm是第一操作数寄存器。
add指令
ADD{S}<c> <Rd>, <Rn>, #<const>
ADD{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
我们将5与R1相加,赋值给了R2
将R0与R1相加,赋值给了R3
sub指令
SUB{S}<c> <Rd>, <Rn>, #<const>
SUB{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
我们将R1与5相减,赋值给了R2
将R0与R1相减,赋值给了R3
以上三条指令都有立即数作为第二操作数的情况,那么是什么立即数呢?
准确的说这里所指的是12位立即数imm12。
先说怎么判断某数是不是12位立即数,12位立即数的条件是:
如果某个数的数值范围是0~255之间,那么这个数一定是立即数;
把某个数展开成2进制,这个数的最高位1至最低位1之间的二进制数序列的位数不能超过8位;
这个数的二进制序列的右边必须为偶数个连续的0
eg:
0x132 = 0000 0000 0000 0000 0000 0001 0011 0010
最高位1至最低位