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

标签 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),但 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/

相关文章:

performance - 快速硬件整数除法

c - C 中的 MPI 分布式计算示例

c - 使用 GraphViz 了解 -fdump-tree 输出 gcc

c - C语言中打印int值或将int转换为字符串

assembly - 如何在汇编语言编程中提示用户输入字符串并再次显示

c - 如何加载 4 个无符号字符并使用 NEON 将它们转换为带符号的短裤?

c - LTO CM CRC 功能

assembly - 使用 xor reg, reg 是否比 mov reg, 0 有优势?

assembly - 需要 AT&T 汇编语法的良好来源

macos - 对 Apple Silicon 的 SSE/neon 支持