MSP430FR5969字节存储与大小端问题:汇编代码正确性验证
你的汇编代码为什么不对?怎么修正?
嘿,这个问题其实是对MSP430指令操作宽度理解的小误区,咱们一步步拆解:
先给结论:你的代码不正确
你用的mov.b #0x41321221,&0x4100是字节传输指令,它只会把源立即数的最低8位(也就是0x21)写入目标地址0x4100的单个字节中,后面的0x12、0x32、0x41会被指令忽略——这就是为什么只有0x4100有值,其他地址没变化的原因。
两种正确的实现方式
根据你的需求(从0x4100开始依次存储字节21、12、32、41,考虑MSP430的小端顺序),有两种可靠的写法:
方式1:逐条字节写入
最直观的方式是用4条mov.b指令,分别给每个地址赋值:
mov.b #0x21, &0x4100 ; 地址0x4100存入21 mov.b #0x12, &0x4101 ; 地址0x4101存入12 mov.b #0x32, &0x4102 ; 地址0x4102存入32 mov.b #0x41, &0x4103 ; 地址0x4103存入41
这种方式不需要考虑大小端,因为每个字节都是独立写入的,完全符合你的预期顺序。
方式2:双字一次性写入(利用小端特性)
MSP430是小端模式(低字节存低地址,高字节存高地址),如果你想用一条指令完成4字节写入,可以用mov.x(双字传输指令)。
你需要的字节顺序对应双字0x41321221:
- 双字的最低8位是
0x21→ 对应低地址0x4100 - 接下来8位是
0x12→ 对应0x4101 - 再接下来8位是
0x32→ 对应0x4102 - 最高8位是
0x41→ 对应0x4103
所以代码可以写成:
mov.x #0x41321221, &0x4100
这条指令会一次性把4个字节按小端顺序写入目标地址起始的连续4个内存单元,正好匹配你的需求。
关键提醒
- MSP430的指令后缀(
.b/.w/.x)决定了操作的数据宽度:.b是字节(8位),.w是字(16位),.x是双字(32位)。一定要根据你的需求选择对应宽度的指令,否则会出现数据截断或未覆盖的问题。
内容的提问来源于stack exchange,提问作者kaann45
相关产品推荐
相关产品推荐

