相关疑难解决方法(0)

在ESP下面写下是否有效?

对于32位Windows应用程序,使用ESP下面的堆栈内存进行临时交换空间而不显式减少ESP是有效的吗?

考虑一个返回浮点值的函数ST(0).如果我们的价值目前在EAX,我们会,例如,

PUSH   EAX
FLD    [ESP]
ADD    ESP,4  // or POP EAX, etc
// return...
Run Code Online (Sandbox Code Playgroud)

或者不修改ESP寄存器,我们可以:

MOV    [ESP-4], EAX
FLD    [ESP-4]
// return...
Run Code Online (Sandbox Code Playgroud)

在这两种情况下都会发生同样的事情,除了在第一种情况下我们注意在使用内存之前递减堆栈指针,然后在之后递增它.在后一种情况下,我们没有.

尽管有任何实际需要在堆栈上持久保存这个值(重入问题,在PUSH返回值和读取值之间的函数调用等),有没有任何根本原因,为什么写入ESP下面的堆栈这样会无效?

windows x86 assembly abi

11
推荐指数
3
解决办法
447
查看次数

ESP是否与EAX一样通用?

在x86架构中,可以做什么EAX但不能用ESP?忘了pushpopcall.

x86 assembly cpu-registers

3
推荐指数
1
解决办法
505
查看次数

ARM组装。将r13(堆栈指针)用作通用寄存器是否安全?

我正在编写一个非常优化的叶子函数,为了使其运行更快,我想使用R13作为通用寄存器。在使用R13并将其从功能返回之前,我通过将R13移至VFP寄存器之一来保留它,方法是将其移回。看起来像这样:

/* Start of the function */
push { r4 - r12, r14 }
vmov s0, r13
/* Body of the function. Here I use R13
 * as a general purpose register */
vmov r13, s0
pop { r4 - r12, r14 }
bx lr
Run Code Online (Sandbox Code Playgroud)

而且有效。但是我已经读到某些操作系统假定R13始终用作堆栈指针,并将其用作通用寄存器可能会导致崩溃。我还应该说这个功能只能在Android(Linux)上运行。谢谢!

linux assembly android arm stack-pointer

2
推荐指数
1
解决办法
305
查看次数

标签 统计

assembly ×3

x86 ×2

abi ×1

android ×1

arm ×1

cpu-registers ×1

linux ×1

stack-pointer ×1

windows ×1