我有一个对象的地址不是 4 字节对齐的。当存在保存 2 个寄存器的 STR 指令时,这会导致 cpu 中出现 HardFault 错误。
这是生成的代码:
00000000 <_ZN8BaseAreaC1EPcmm>:
0: b510 push {r4, lr}
2: 4604 mov r4, r0
4: 6042 str r2, [r0, #4]
6: e9c4 3102 strd r3, r1, [r4, #8]
a: 2001 movs r0, #1
c: 7420 strb r0, [r4, #16]
e: b921 cbnz r1, 1a <_ZN8BaseAreaC1EPcmm+0x1a>
这些是在“4:6042 ...”行时的寄存器
R0 08738B82 R8 0
R1 08738BAE R9 0
R2 0 R10 082723E0
R3 2FCC R11 0
R4 08738B82 R12 0
R5 20007630 R13 2000CB38
正如所见,STR 指令的目标寄存器未在 4 字节上对齐。该指令STR r2, [r0, #4]
执行良好。但它的HardFaults 就在下STRD r3, r1, [r4, #8]
。如果我手动将寄存器 R4 更改为08738B80
它不会出现硬故障。
这是生成上述 asm 的 C++ 代码:
BaseArea::BaseArea(char * const pAddress, unsigned long startOffset, unsigned long endOffset) :
m_pAddress(pAddress), m_start(startOffset), m_end(endOffset), m_eAreaType(BASE_AREA) {
And是类中的第一个变量,与( )m_start
具有相同的地址,在 on 之后。this
0x08738B82
m_end
0x08738B86
如何让对象对齐 4 字节?有人对此有其他解决方案吗?