← 返回笔记列表

3.3移位操作和流控制

2026-03-22
计组汇编

接下来我们引入逻辑移位和算术移位和循环移位:
一.不同移位操作

笔记图片

逻辑移位也就是只通过补0,来改变移动后的位置

笔记图片

算术移位:带符号的移动也就是首位是符号位,也就是我们移动的话需要补充他的符号位,如果是正数左移还是右移我们补0,负数右移动的时候我们补1,补他的符号位,左移还是补0


笔记图片



笔记图片

循环移位:我们会把首位扔到CCR的进位位再拿回来

笔记图片



笔记图片

二.ARM对移位操作的实现


笔记图片

我们把32位指令的第25位的位置进行何种操作取决于他是0还是1,是1(我们马上说),如果是0的话:将第0位到第11位进行区分其中有移动长度,移动类型(比如说LSL),要移动的目标寄存器,放入桶型移位器在ALU算术逻辑核心计算后再实现原操作

笔记图片

没有实现的操作:我们可以通过其他方式实现
尽管没有循环左移:可以借助循环右移实现,即32-循环右移位数
没有实现带进位的循环左移操作:也就是我们即需要左移乘以2,还要加上循环回来的进位位
我们可以通过ADCs r0,r0,r0实现,这样就是r0加r0实现乘2操作,然后因为ADCs会自动更新进位位并相加,所以我们实现了上述操作

笔记图片

这里将第25位区分:
如果是1的话我们的第三个操作数是个12位立即数(后面还要区分)
如果是0的话,我们进行的操作是个寄存器,
其中如果第四位是0,则我们要对寄存器移动一个立即数的长度比如说 ADD r0 r0 r1 LSL #4
其中如果第四位是1,我们要对寄存器移动另一个寄存器地址下的值,即我们上面例子的#4改成 r2,相当于移位r2地址下寄存器中的值

笔记图片