gpt4 book ai didi

c - 堆栈指针从寄存器读取错误值

转载 作者:行者123 更新时间:2023-11-30 14:53:09 25 4
gpt4 key购买 nike

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

enter image description here

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

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

提前致谢。

最佳答案

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com