如何从 x64 程序集中的堆栈获取参数?
How to get an argument from stack in x64 assembly?
我正在尝试用 x64 汇编编写一个过程。
我在用 C++ 编写的主程序中调用它。我正在传递几个参数。我知道前 4 个将在特定的寄存器中,其余的(应该)在堆栈中。更重要的是,我读到在从堆栈中取出第 5 个参数之前,我应该从 RSP 中减去 40。一开始它奏效了。后来我需要检查 sth 的地址,所以我通过:cout 和 & 来完成。但是,从堆栈中获取第 5 个参数没有用,我不知道我该怎么做。
C++代码片段:
std::cout << xOld << '\t' << &xOld << std::endl;
std::cout << xOld[0] << '\t' << &xOld[0] << std::endl;
SthInAsm(A, B, alfa, beta, n, xOld, xNew, lowerBound, upperBound, condition, isReady, precision, maxIterations);
Asm 代码片段:
.data
Aaddr DQ 0
Baddr DQ 0
alfa DQ 0
beta DQ 0
n DQ 0
xOld DQ 0
.
.
.
.code
SthInAsm PROC
MOV Aaddr, RCX
MOV Baddr, RDX
MOV alfa, R8
MOV beta, R9
SUB RSP, 40
XOR RAX, RAX
POP n
MOV RAX, n
.
.
.
'MOV RAX, n' 之后 RAX 不包含 n 的值。当我在调用这个函数之前没有通过 cout 检查地址时,它起作用了。
有谁知道这里有什么问题吗?
多亏了 Jester,我才知道我的代码有什么问题。当我阅读有关 x64 程序集的内容时,我一定误解了某事。从 RSP 中减去 - 我不应该这样做。
取而代之的是,当我编写时,从堆栈获取参数有效:
MOV RAX, QWORD PTR [RSP+40]
MOV RAX, QWORD PTR [RSP+48]
等等
再次感谢杰斯特!
我正在尝试用 x64 汇编编写一个过程。
我在用 C++ 编写的主程序中调用它。我正在传递几个参数。我知道前 4 个将在特定的寄存器中,其余的(应该)在堆栈中。更重要的是,我读到在从堆栈中取出第 5 个参数之前,我应该从 RSP 中减去 40。一开始它奏效了。后来我需要检查 sth 的地址,所以我通过:cout 和 & 来完成。但是,从堆栈中获取第 5 个参数没有用,我不知道我该怎么做。
C++代码片段:
std::cout << xOld << '\t' << &xOld << std::endl;
std::cout << xOld[0] << '\t' << &xOld[0] << std::endl;
SthInAsm(A, B, alfa, beta, n, xOld, xNew, lowerBound, upperBound, condition, isReady, precision, maxIterations);
Asm 代码片段:
.data
Aaddr DQ 0
Baddr DQ 0
alfa DQ 0
beta DQ 0
n DQ 0
xOld DQ 0
.
.
.
.code
SthInAsm PROC
MOV Aaddr, RCX
MOV Baddr, RDX
MOV alfa, R8
MOV beta, R9
SUB RSP, 40
XOR RAX, RAX
POP n
MOV RAX, n
.
.
.
'MOV RAX, n' 之后 RAX 不包含 n 的值。当我在调用这个函数之前没有通过 cout 检查地址时,它起作用了。
有谁知道这里有什么问题吗?
多亏了 Jester,我才知道我的代码有什么问题。当我阅读有关 x64 程序集的内容时,我一定误解了某事。从 RSP 中减去 - 我不应该这样做。
取而代之的是,当我编写时,从堆栈获取参数有效: MOV RAX, QWORD PTR [RSP+40] MOV RAX, QWORD PTR [RSP+48] 等等
再次感谢杰斯特!