ARM数据指令及运算指令
Comment多久了,多久没有写博客了。很久了。
大半年以来,一直在名为探索的道路上盘旋。期间发生了很多事,但都只是经历。
我总说,人是一座座孤岛,我用它来将人与人之间的理解隔离开来。所以,当我遇到一些人,不理解我的时候,或者我无法理解他人的时候,我就会把这句话当作是我唯一的真理,继而封锁自己。
但我觉得我这样做不太妥当。
闲谈的话就先说到这吧,毕竟标题上来讲,是要写arm相关的事情的。
1.立即数
先来介绍一下立即数的概念,立即数是能够直接写进机器码的数,有的也说叫 能写在指令编码中的常量。
但,什么意思,什么用处?
能直接写进机器码的数,就不需要再从常量池中拿数据,可以减少消耗。
但是立即数也不是随便定义的,人家有正规的说法:
立即数是能表示为一个 8 位数经过偶数位右旋 (0,2,4,…30) 的结果
8位数,就是8位二进制数,0-255之间的值
(0x00–0xFF)。一个字节=8位。
1 个十六进制字符 = 4 位二进制。
所以…16进制中,小于0xFF的数,都是立即数,即经过0位右旋可以得到本身。
大于 0xFF 的数,要看能否由某个 8 位数旋转得到。
判断 一个 32 位数能不能作为 ARM 立即数,其实就是在检查它是否符合 “8 位数经过偶数位右旋” 的规则。
2.寄存器移位
其实很简单,举个例子就能明白:
1 | r0,lsl #4 @r0<<4 |
只能是对寄存器进行操作,无法对立即数作为对象操作。
3.数据传输指令
mov指令
可以用mov指令对寄存器进行赋值操作。
格式:mov 目标寄存器,操作数2(一般来讲操作数1不能忽略,操作数1只能是寄存器,但mov比较特别,操作数2:立即数,寄存器,寄存器移位)
举例:
1 | mov r0,#1 |
ldr指令
同样是赋值数据到目标寄存器,但和mov不同。ldr通常用来把任意的数据传送到目标寄存器。
伴随我的那些东西,究竟是我的一厢情愿还是理所应该存在于自我世界。
举个例子:
1 | ldr r0,=0x12345678 |
这里的数据也显而易见,不按立即数处理,也就没必要加#。
4.数据计算指令
数据计算指令这部分,不是我们一眼望去的那么简单,add,sub,mul 随便跟点东西。但事实绝非如此,跟什么东西是有讲究的。
例子:
1 | add 目标寄存器, 操作数1,操作数2 |
5.跳转指令
跳转指令有两种方式:b/bl 为pc寄存器赋值
1). b/bl
b/bl可以跳转到自己设置的标签处。bl跳转之前会把pc寄存器的值(也就是保存返回地址)到LR寄存器(Link Register, R14),b只是单纯跳转。
2). pc
1 | ldr pc,=标签名 |
无论我怎么想,它都会到来。