堆栈指针从寄存器

时间:2017-11-18 17:27:27

标签: c assembly arm inline-assembly keil

为什么堆栈指针寄存器没有从另一个寄存器读取正确的值?当我将值从寄存器(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),但不是实际地址,即0x3FFFFDA7,SP接收0x3FFFFDA4。 图像显示了反汇编,

enter image description here

那么这里发生了什么?为什么堆栈指针寄存器读取的值不正确?

我正在使用带有C的ARM内联汇编.IDE是KEIL。

先谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

因此,如果要将任何值移动到堆栈指针,请确保它是4字节对齐的。