我刚学完ARM架构/程序集。如果SP寄存器保存下一个存储位置的地址来存放数据,那么堆的地址是什么?例如,在C++中,如果你在堆上声明一个对象(例如MyObj example = new MyObj();
),那么程序集看起来会是什么样子,从哪里知道example
是哪里?什么寄存器指向堆?
4
A
回答
5
在此上下文中的堆栈是由OS/EABI提供的较低级别的结构。这就是为什么有一个传统的注册表。但是,堆是OS提供的更高层次的结构。因此,管理和使用它取决于与您的应用程序和操作系统的协议。在汇编术语中,您将使用该堆通过寄存器取消引用一些地址。
5
0
在ARM的EABI中,R13(SP)指向完全递减堆栈中的最后推送数据。然而,没有必要指出,在任何时候,这样的代码可以是合法的:
考虑到r0指向我们的程序可访问的有效内存位置。
stmfd r0!, {r1-r12, sp, lr}
ldr r1, [r0]
mov r2, lr
sub lr, sp, #4
str sp, [r4]
add sp, lr, #4
ldmfd r0!, {r1-r12, sp, pc}
ofcourse它没有任何意义,但它是唯一的一点是,如果你可以安全地重新加载SP,LR和其他所有被调用函数保存的寄存器,你可以从头开始他们多,你想一边回忆恢复他们的价值在返回给调用者之前。另一点,堆栈和堆可能不一定相同,堆是malloc/free类型构造的更高级别的抽象,而堆栈仅用于在4个寄存器不足或用于传递函数参数时保存被调用寄存器,数据结构和所有你可以想象的,但堆栈有点难以管理,因为你必须自己跟踪所有的数据,而不是仅仅将一个区域分配给一个指针,然后在完成后释放它。
通常取决于程序和环境,您可以使用各种黑客和东西的优化技术,如明知腐败的一些非暂存寄存器,并摆脱它,但是你必须要管理,在您的来电显示功能,它应该是意识到在随后的函数调用中会被划伤的寄存器,因此EABI只有在将控制转移到另一个程序或接管时才有意义,您可以在CPU上执行您喜欢的任何操作,只需确保将其保留为干净它是在你进入这个地方之前。
1
处理器需要一个特殊的堆栈指针寄存器,因为有时(中断或异常)处理器硬件必须直接修改SP,而不执行任何代码。这对堆没有必要,所以不需要使用特殊寄存器来指向堆。在运行时,操作系统决定特定的代码块在堆中的存储位置,并且可以使用任何寄存器来保存该地址。
相关问题
- 1. 为什么指向16位寄存器的指针是uword?
- 2. 为什么在FreeBSD中重置堆栈指针寄存器?
- 3. 堆栈指针寄存器值
- 4. 这些寄存器为什么被推入堆栈?
- 5. 导出寄存器对堆栈的性能影响是什么?
- 6. 寄存器和临时寄存器有什么区别?
- 7. 寄存器指定Keystone
- 8. 指针寄存器变量
- 9. 寄存器和指针
- 10. 为什么SSE指令保留YMM寄存器的高128位?
- 11. 如何将堆栈指针寄存器中的值存储到存储器(8085)?
- 12. 指向端口寄存器位的指针
- 13. MOV [EBX],AX - 指向寄存器的指针?
- 14. 堆栈指针寄存器如何工作
- 15. 为什么内存和寄存器不允许递归,而堆栈呢?
- 16. 什么是ESP和EBP寄存器?
- 17. 什么是专用寄存器?
- 18. 为什么24位寄存器?
- 19. 为什么只有四个寄存器?
- 20. PIC寄存器(%ebx)是做什么的?
- 21. 为什么使用2个指针指向atmega微控制器的寄存器地址?
- 22. 读取由GDB寄存器指向的内存
- 23. 将XMM寄存器推入堆栈
- 24. 堆栈上EBP寄存器的大小?
- 25. 定义寄存器堆栈阵列
- 26. 恢复用户堆栈/寄存器
- 27. 为什么建立普通布尔MRSW寄存器需要2个寄存器?
- 28. 为什么使用临时寄存器将值传递给段寄存器?
- 29. 当我们已经有程序计数器寄存器时,为什么我们需要一个堆栈指针寄存器?
- 30. 为什么编译器将变量存储在寄存器中?
这是编译器的实现细节。 http://www.blackhat.com/presentations/bh-usa-07/Ferguson/Whitepaper/bh-usa-07-ferguson-WP.pdf –
寄存器是CPU需要知道的事情。有一个SP寄存器,因为CPU有特殊的硬件,可以自动执行堆栈操作(例如,发生中断时保存上下文)。 CPU不知道或关心堆。 – TJD
堆不是硬件的东西,堆栈是。 heap和堆内的分配与语言和库有关(与硬件无关)。 –