汇编语言从任意对齐的地址处加载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