ldr内存加载指令可以从内存的堆栈部分加载吗

can an ldr memory load instruction ..load from the stack part of the memory

我脑子里有这套手臂指令。

sub r3,sp,4    
ldr r1, [r3]

为了清楚起见,普通的 ldr 指令可以从内存的堆栈部分加载值吗?

是的,绝对是。堆栈只是 32 位虚拟地址 space 的一个特定区域,指向该区域的指针可以存在于任何寄存器中,而不仅仅是 sp.

使用 sp 以外的东西作为基址寄存器,通过加载和存储访问堆栈是非常常见的。高级语言经常这样做,例如:

void func(void) {
    int x;
    scanf("%d", &x);
    // ...
}

x的地址在栈上,将被放入r1传递给scanfscanf 会做类似 str r2, [r1] 的事情来存储输入的数字。 scanf 既不知道也不关心 r1 是否指向堆栈或堆或地址的任何其他部分 space.

任何类型的仿真或建模工具都需要考虑这种别名。

当然可以。这实际上就是 PUSHPOP 命令的工作方式。大多数时候你可以使用统一的语法而不必编写它们,但它们实际上看起来像这样。 (完全披露:我唯一使用过的 ARM CPU 是 ARM7TDMI,所以我不知道这是否没有改变。)

STMFD sp!,{r0-r12}  ;ARM32 equivalent of PUSH  R0-R12
LDMFD sp!,{r0-r12}  ;ARM32 equivalent of POP R0-R12