ARM汇编指令str,ldr引用地址不为4个字节整数倍出现的问题

本文详细解析了ARM汇编语言中str和ldr指令的行为,特别是当操作地址不是4字节对齐时的现象。通过具体示例,阐述了指令如何处理未对齐的地址,以及这对数据读写的实际影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ARM汇编指令str,ldr引用地址不为4个字节整数倍出现的问题

1.无问题代码

	area test, code, readonly
	code32
	entry							;汇编头定义
start
	mov r0, #0x00000000fe			;将0xfe存入寄存器r0
	ldr r1, =0x40000000				;  将0x40000000地址存r1
	str r0, [r1]					;  将0xfe(存于r0)写入0x40000000地址空间
	ldr r2, [r1]					;将0x40000000地址的值读到r2
	nop
	nop
	end
  1. 问题
情况结果
当r1存入的地址值为0x40000000+1时r2读出的的值为0xfe00000000
当r1存入的地址值为0x40000000+2时r2读出的的值为0x00fe000000
当r1存入的地址值为0x40000000+3时r2读出的的值为0x000000fe00
  1. 原因

    a.指令str:无论存入地址为多少都是以4个字节为单位存入,也就是说无论存入地址是0x40000000或0x40000001或0x400000002或0x40000003,存入都是以0x40000000开始;也就是说存入地址无论是哪个存入结构都是如表

地址
0x400000000fe
0x40000000100
0x40000000200
0x40000000300

b.指令ldr:读取以4个字节为单位循环读取,也就是说假设存入0xfe,从低地址->高地址(fe-00-00-00),当从0x40000001开始读取时,从低地址->高地址(00-00-00-fe),所以r2就成了0xfe000000;当从0x40000002读取时从低地址->高地址(00-00-fe-00),所以r2就成了0x00fe0000;当从0x40000003读取时从低地址->高地址(00-fe-00-00),所以r2就成了0x0000fe00。

4.总结

当对arm存储器操作时必须以4字节为单位进行读写。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值