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                ;结束程序

结果:

 

 

 

 


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

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部