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
传递给scanf
。 scanf
会做类似 str r2, [r1]
的事情来存储输入的数字。 scanf
既不知道也不关心 r1
是否指向堆栈或堆或地址的任何其他部分 space.
任何类型的仿真或建模工具都需要考虑这种别名。
当然可以。这实际上就是 PUSH
和 POP
命令的工作方式。大多数时候你可以使用统一的语法而不必编写它们,但它们实际上看起来像这样。 (完全披露:我唯一使用过的 ARM CPU 是 ARM7TDMI,所以我不知道这是否没有改变。)
STMFD sp!,{r0-r12} ;ARM32 equivalent of PUSH R0-R12
LDMFD sp!,{r0-r12} ;ARM32 equivalent of POP R0-R12
我脑子里有这套手臂指令。
sub r3,sp,4
ldr r1, [r3]
为了清楚起见,普通的 ldr 指令可以从内存的堆栈部分加载值吗?
是的,绝对是。堆栈只是 32 位虚拟地址 space 的一个特定区域,指向该区域的指针可以存在于任何寄存器中,而不仅仅是 sp
.
使用 sp
以外的东西作为基址寄存器,通过加载和存储访问堆栈是非常常见的。高级语言经常这样做,例如:
void func(void) {
int x;
scanf("%d", &x);
// ...
}
x
的地址在栈上,将被放入r1
传递给scanf
。 scanf
会做类似 str r2, [r1]
的事情来存储输入的数字。 scanf
既不知道也不关心 r1
是否指向堆栈或堆或地址的任何其他部分 space.
任何类型的仿真或建模工具都需要考虑这种别名。
当然可以。这实际上就是 PUSH
和 POP
命令的工作方式。大多数时候你可以使用统一的语法而不必编写它们,但它们实际上看起来像这样。 (完全披露:我唯一使用过的 ARM CPU 是 ARM7TDMI,所以我不知道这是否没有改变。)
STMFD sp!,{r0-r12} ;ARM32 equivalent of PUSH R0-R12
LDMFD sp!,{r0-r12} ;ARM32 equivalent of POP R0-R12