求助!arm内联汇编读取栈内容到C变量失败

下面这段代码的目的,是把栈里面的内容,读取到C变量当中

void readStack() {
    uint64_t value1;
    uint64_t value2;
    uint64_t reg10;
    uint64_t reg11;
    
    // 先把x10、x11寄存器的值暂存起来
    __asm volatile("str x10, [%0]\n" :: "r"(&reg10));
    __asm volatile("str x11, [%0]\n" :: "r"(&reg11));
    
    // 从栈中读取到x10、x11寄存器,然后保存到变量中
    __asm volatile("ldp x10, x11, [sp], #16\n");// 执行完这一句后,reg10和reg11的值就变了
    __asm volatile("str x10, [%0]\n" :: "r"(&value1));
    __asm volatile("str x11, [%0]\n" :: "r"(&value2));
    
    __asm volatile("sub sp, sp, 16");

    __asm volatile("ldr x10, [%0]\n" :: "r"(&reg10));
    __asm volatile("ldr x11, [%0]\n" :: "r"(&reg11));
}

但是在执行完 ldp 指令以后,之前用来暂存x10x11值的reg10 reg10 ,里面内容就变了

求教为什么reg10 reg10 的值会变

Load Pair of Registers calculates an address from a base register value and an immediate offset, loads two 32-bit words or two 64-bit doublewords from memory, and writes them to two registers. For information about memory accesses, see Load/Store

查了下,是sp改变导致的,只要sp改变,之前存下的reg10reg11就会改变,不过还是没搞懂为什么

1 个赞

李在想森莫

莫森说在李