我有一个对象,它的地址不是4字节对齐的。当有一个STR指令保存2个寄存器时,这会导致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行,即“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]
可以正常执行。但在下一个STRD r3,r1,[r4,#8]
上会导致硬件错误。如果我手动将寄存器R4更改为08738B80
,则不会发生硬件错误。
这是生成上述汇编代码的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) {
而且 m_start
是该类中的第一个变量,并且与 this
(0x08738B82
) 具有相同的地址,m_end
在其后跟随在 0x08738B86
上。
我如何将对象对齐到4字节?还有其他解决方案吗?
BaseArea
的结构,并说明构造函数在哪里被调用? - Mats Petersson