执行期间的 LDRD 硬故障

LDRD hard faulting during execution

我正在创建一个多态代码,但我对 LDRD 指令有一个问题,这让我很抓狂,我看不到它。执行时明显出现 NMI 硬故障。 我在 STM32L4A6AG 上。 问题可能出在汇编代码中,但也可能出在操作码生成上(被反汇编程序忽略?)。

数据是在 ldrd 执行之前获取的:

我的代码:

2004ffc0: 0xbff36f8f   isb     sy
2004ffc4: 0xbff34f8f   dsb     sy
2004ffc8: 0x000020b5   push    {r5, lr}
2004ffca: 0xdff80c50   ldr.w   r5, [pc, #12]   ; 0x2004ffd8
2004ffce: 0xdfe90301   ldrd    r0, r1, [pc, #12]       ; 0x2004ffdc
2004ffd2: 0x0000a847   blx     r5
2004ffd4: 0x000000bf   nop     
2004ffd6: 0x000020bd   pop     {r5, pc}

注册:

    r0  0x0 (Hex)   
    r1  0x1 (Hex)   
    r2  0x2004ffc0 (Hex)    
    r3  0x2004ffbf (Hex)    
    r4  0xaabbccdd (Hex)    
    r5  0x80107e1 (Hex) 
    r6  0x0 (Hex)   
    r7  0x2004ff98 (Hex)    
    r8  0   
    r9  0   
    r10 0   
    r11 0   
    r12 0   
    sp  0x2004ff90  
    lr  0x80104ed (Hex) 
    pc  0x2004ffce  

内存:

x/9wx 0x2004ffc0
0x2004ffc0: 0x8f6ff3bf  0x8f4ff3bf  0xf8dfb520  0xe9df500c
0x2004ffd0: 0x47a80103  0xbd20bf00  0x080107e1  0xeeffaabb
0x2004ffe0: 0xaabbccdd

x/18hx 0x2004ffc0
0x2004ffc0: 0xf3bf  0x8f6f  0xf3bf  0x8f4f  0xb520  0xf8df  0x500c  0xe9df
0x2004ffd0: 0x0103  0x47a8  0xbf00  0xbd20  0x07e1  0x0801  0xaabb  0xeeff
0x2004ffe0: 0xccdd  0xaabb

谢谢大家!

根据 ARM manual,具有 pc 相对寻址模式的 ldrd 指令必须在 ARMv7-M 部件上进行字对齐。如果汇编程序不处理这个问题,可能需要手动对齐:

.align
ldrd r0, r1, [pc, #12]