ARM汇编实现将寄存器高低位对称换位
实现将寄存器高位和低位对称换位操作,如: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 ENTRYMOV R0, #0 ;R0清零LDR R1,=0x55555555 ;这里我直接把R1的值赋成要换位的数了 为啥要这么赋值是因为这是一个不合法的立即数,不能用MOV来赋值,只能用伪指令来做,大概是这样,我只模糊地记得老师大概是这么说的MOV R3, #1 ;R3用来做计数器
loopTEQ R3, #32 ;判断计数器是否已经加到32BEQ return ;若已加到32,跳转到程序结束处;否则继续执行ADD R3, R3, #1 ;计数器自加1,向前推进AND R2, R1, #1 ;将R1与1做与运算的结果存到R2中,即获取R1的低1位TEQ R2, #0 ;判断R1的低1位是0还是1BEQ add0 ;如果是0,跳转到给R0的低1位加上0的代码段;如果是1,执行给R0的低1位加上1的代码段ADD R0, R0, #1 ;R0最低位加1LSL R0, #1 ;R0左移一位,空出最低位LSR R1, #1 ;R1右移一位,更新最低位B loop ;无条件跳转,继续执行add0ADD R0, R0, #0 ;R0最低位加0 LSL R0, #1 ;R0左移一位,空出最低位LSR R1, #1 ;R1右移一位,更新最低位B loop ;无条件跳转,继续执行return END ;结束程序
结果:

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
