我正在尝试在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检查地址时,它可以工作。
有人知道这是什么问题吗?
感谢杰斯特,我知道我的代码出了什么问题。当我阅读有关x64汇编的文章时,我一定有误会。从RSP减去-我不应该这样做。
代替的是,在我写时从堆栈获取参数是可行的:MOV RAX,QWORD PTR [RSP + 40]MOV RAX,QWORD PTR [RSP + 48]等
再次感谢您的小丑!