如何从x64程序集中的堆栈中获取参数?

问题描述 投票:0回答:1

我正在尝试在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检查地址时,它可以工作。

有人知道这是什么问题吗?

c++ assembly stack x86-64 calling-convention
1个回答
0
投票

感谢杰斯特,我知道我的代码出了什么问题。当我阅读有关x64汇编的文章时,我一定有误会。从RSP减去-我不应该这样做。

代替的是,在我写时从堆栈获取参数是可行的:MOV RAX,QWORD PTR [RSP + 40]MOV RAX,QWORD PTR [RSP + 48]等

再次感谢您的小丑!

© www.soinside.com 2019 - 2024. All rights reserved.