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

结果:

 

 

 

 

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值