我的笔记——立即数,循环右移

什么是立即数

百度上是这么说的:立即数通常是指在立即寻址方式指令中给出的数。可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。
那看的是一脸懵,后面以ARM汇编编译器为例:立即数方式:每个立即数由一个8位的常数循环右移偶数位得到。其中循环右移的位数由一个4位二进制的两倍表示。如果立即数记作,8位常数记作immed_8,4位的循环右移值记作rotate_imm,则有:
=immed_8循环右移(2*rotate_imm)
公式给的不错,但对于小白来说还是有点难以理解,我记得当初上课明明理解了,现在看还是懵的

理解

这里面的8位常数就是指0X00-0XFF了,后面那个循环右移4位二进制的两倍,4位二进制就是0X0-0XF了,二倍那就是0到30的偶数呀,也就是每次至少右移两位

循环右移

就比如说32位的一个数,0X00000001,换算成二进制就是0000 0000 0000 0000 0000 0000 0000 0001,循环右移一位,就是最后一位移到最前面,其它位都往右边移一位,变成1000 0000 0000 0000 0000 0000 0000 0000,换算成十六进制就是0X80000000,循环左移同理

举例立即数

像0X104就是立即数,0X101就不是立即数,0X104换算成二进制是0000 0000 0000 0000 0000 0001 0000 0100,可以看做是0000 0000 0000 0000 0000 0000 0100 0001循环右移30位变换成的,所以是立即数,但0X101换算成二进制是0000 0000 0000 0000 0000 0001 0000 0001,无法通过变换完成,所以不是立即数
一个简单的区分立即数的方法,立即数是8位常数变换来的,右移偶数位其实根本没有限制,因为8位的常数是可变的,那么只要保证数值换算成二进制后带有1的数位在8位以内就可以判定为立即数。

你可能感兴趣的:(stm32,c语言,arm)