汇编语言从任意对齐的地址处加载32位字数据

汇编语言从任意对齐的地址处加载32位字数据

假设字数据地址在r0中,操作模式为小端格式,且结果保存在r1中使用代码

如下

BIC r2,r0,#3               ;取出地址,屏蔽掉第0~1位
LDMIA r2,{r1,r3}           ;将包含改字的64位数加载到寄存器r1和r3中
AND r2,r0,#3			   ;按字节对齐
MOVS r2,r2,LSL #3		   ;按位对齐
MOVEN r1,r1,LSR r2		   ;从低32位中读数据,偏移8位
RSBNE r2,r2,#32			   ;余下的偏移量:32-偏移量
ORRNE r1,r1,r3,LSL r2      ;获得高32位,并合并低组合在一起
情况一

绿色为数据区域

需要最终结果[r1]=32 45 E9 AA

在这里插入图片描述

即 r0初始化为4
r0=000100
第一步:
取出地址,屏蔽掉第0~1位
r2=000100
第二步:
将包含改字的64位数加载到寄存器r1和r3中
[r1]=32 45 E9 AA
[r3]=BB CC DD EE
第三步:
按字节对齐
r2=000000
第四步:
按位对齐
r2=000000
第五-七步:
因为r2==0
所以不执行
最终结果[r1]=32 45 E9 AA
情况二

绿色为数据区域

需要最终结果[r1]=45 E9 AA BB

在这里插入图片描述

即 r0初始化为5
r0=000101
第一步:
取出地址,屏蔽掉第0~1位
r2=000100
第二步:
将包含改字的64位数加载到寄存器r1和r3中
[r1]=32 45 E9 AA
[r3]=BB CC DD EE
第三步:
按字节对齐
r2=000001
第四步:
按位对齐
r2=001000  
第五步:
因为r2!=0
从低32位中读数据,偏移8位
[r1]=45 E9 AA 00
第六步:
余下的偏移量:32-偏移量=32-8=24
r2=011000
获得高32位,并合并低组合在一起
[r3]=00 00 00 BB
[r1]=45 E9 AA BB
最终结果[r1]=45 E9 AA BB
情况三

绿色为数据区域

需要最终结果[r1]=E9 AA BB CC

在这里插入图片描述

即 r0初始化为6
r0=000110
第一步:
取出地址,屏蔽掉第0~1位
r2=000100
第二步:
将包含改字的64位数加载到寄存器r1和r3中
[r1]=32 45 E9 AA
[r3]=BB CC DD EE
第三步:
按字节对齐
r2=000010
第四步:
按位对齐
r2=010000  
第五步:
因为r2!=0
从低32位中读数据,偏移16位
[r1]=E9 AA 00 00
第六步:
余下的偏移量:32-偏移量=32-16=16
r2=010000
获得高32位,并合并低组合在一起
[r3]=00 00 BB CC
[r1]=E9 AA BB CC
最终结果[r1]=E9 AA BB CC
情况四

绿色为数据区域

需要最终结果[r1]=AA BB CC DD

在这里插入图片描述

即 r0初始化为7
r0=000111
第一步:
取出地址,屏蔽掉第0~1位
r2=000100
第二步:
将包含改字的64位数加载到寄存器r1和r3中
[r1]=32 45 E9 AA
[r3]=BB CC DD EE
第三步:
按字节对齐
r2=000011
第四步:
按位对齐
r2=011000  
第五步:
因为r2!=0
从低32位中读数据,偏移24位
[r1]=AA 00 00 00
第六步:
余下的偏移量:32-偏移量=32-24=8
r2=001000
获得高32位,并合并低组合在一起
[r3]=00 BB CC DD
[r1]=AA BB CC DD
最终结果[r1]=AA BB CC DD
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值