实现将寄存器高位和低位对称换位操作,如:R0 = 0x55555555
分析:5(十六进制) = 0101(二进制)
高低位对称交换:0101(二进制) -> 1010(二进制) = A(十六进制)
所以最终的结果应该是 R0 = 0xAAAAAAAA
思路: 网上有一个什么蝶式交换算法,但是我太笨了,我是真的看不懂,这是我的做法
先把R0中的内容存进R1(其它也可以),清空R0;
循环32次(一个寄存器有32位),每次循环做这么几件事:
R1和0x1做与运算(为了得到R1的最低位),R0加上这个与运算的结果;
加完后,R0左移一位,R1右移一位,计数器加1,进行下一次循环
代码:
AREA TEST, CODE, READONLY
ENTRY
MOV R0, #0 ;R0清零
LDR R1,=0x55555555 ;这里我直接把R1的值赋成要换位的数了 为啥要这么赋值是因为这是一个不合法的立即数,不能用MOV来赋值,只能用伪指令来做,大概是这样,我只模糊地记得老师大概是这么说的
MOV R3, #1 ;R3用来做计数器
loop
TEQ R3, #32 ;判断计数器是否已经加到32
BEQ return ;若已加到32,跳转到程序结束处;否则继续执行
ADD R3, R3, #1 ;计数器自加1,向前推进
AND R2, R1, #1 ;将R1与1做与运算的结果存到R2中,即获取R1的低1位
TEQ R2, #0 ;判断R1的低1位是0还是1
BEQ add0 ;如果是0,跳转到给R0的低1位加上0的代码段
;如果是1,执行给R0的低1位加上1的代码段
ADD R0, R0, #1 ;R0最低位加1
LSL R0, #1 ;R0左移一位,空出最低位
LSR R1, #1 ;R1右移一位,更新最低位
B loop ;无条件跳转,继续执行
add0
ADD R0, R0, #0 ;R0最低位加0
LSL R0, #1 ;R0左移一位,空出最低位
LSR R1, #1 ;R1右移一位,更新最低位
B loop ;无条件跳转,继续执行
return
END ;结束程序
结果: