我有一個地址不是4字節對齊的對象。當存在STR指令保存2個寄存器時,這會在CPU中導致HardFault錯誤。未對齊的訪問會導致ARM Cortex-M4上的錯誤
這是所生成的代碼:
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]
執行正常。但它在下一個STRD r3, r1, [r4, #8]
HardFault。如果我手動將寄存器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) {
而且m_start
是在類中的第一變量和具有相同的地址作爲this (08738B82)
,後m_end如下上0x08738B86
。
如何獲得4字節對齊的對象? 任何人都有其他解決方案?
你是否實際上在彙編程序設計,或是由例如產生該代碼一個C編譯器? –
@JoachimPileborg:鑑於它明顯地「破壞了C++的名字」,我懷疑它是C++代碼。 –
這是從C++生成的彙編代碼。 – rdrmntn