为什么堆栈指针寄存器没有从另一个寄存器读取正确的值?当我将值从寄存器(r0)移到堆栈指针(r13)时,SP读取了不正确的值。
这是什么意思:

MOV R0, 10
MOV R13, R0


在这种情况下,“ A”应移至R13,但改为8。
同样,

MOV R0, 9
MOV R13, R0


在这种情况下,R13存储8而不是9。

这是一个演示问题的简单程序,

void Init()
{
    __asm(
        "LDR R0, =0x3FFFFDA7\n"
        "MOV R13, R0\n"
    );
}


int main(void)
{
    Init();
    return (1);
}

void SystemInit(void)
{
}


这里什么都没发生。只是一个简单的函数调用。在函数内部,我将地址移至了r0。然后我将地址移到R13(SP),但SP收到的是0x3FFFFDA4,而不是实际地址,即0x3FFFFDA7。
该图显示了拆卸过程,

c - 堆栈指针从寄存器读取不正确的值-LMLPHP

那么这是怎么回事?为什么堆栈指针寄存器读取不正确的值?

我正在将ARM内联汇编与C一起使用。IDE是KEIL。

提前致谢。

最佳答案

对于那些可能会觉得有用的人。

armv7的堆栈指针必须对齐4个字节。您可以在那里写0、4、8、12、16等,但不能写9,10,F等。

因此,如果要将任何值移至Stack-Pointer,请确保其对齐4个字节。

关于c - 堆栈指针从寄存器读取不正确的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47368944/

10-11 19:11