Как получить аргумент из стека в сборке x64?

Пытаюсь написать процедуру на x64 сборке.

Я вызываю это в основной программе, написанной на C ++. Я передаю несколько параметров. Я знаю, что первые 4 будут в определенных регистрах, а остальные (должны быть) в стеке. Более того, я читал, что прежде чем брать 5-й аргумент из стека, я должен вычесть 40 из RSP. И вначале это сработало. Позже мне нужно было проверить адрес 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 перед вызовом этой функции, это сработало.

Кто-нибудь знает, в чем тут проблема?


person OftenDeadKanji    schedule 31.12.2019    source источник
comment
Вы не должны удалять (выталкивать) аргументы из стека, это ответственность вызывающего. И вы не должны sub rsp, 40. Вы можете ссылаться на 5-й аргумент как на [rsp+40].   -  person Jester    schedule 31.12.2019
comment
Хорошо, спасибо за совет. Я изменю свой код так, чтобы он принимал 5-й аргумент, не пытаясь удалить его из стека.   -  person OftenDeadKanji    schedule 31.12.2019


Ответы (1)


Благодаря Jester я знаю, что не так в моем коде. Я, должно быть, неправильно понял, когда прочитал о сборке x64. Вычитать из РСП - не надо.

Вместо этого получение аргументов из стека работает, когда я пишу: MOV RAX, QWORD PTR [RSP + 40] MOV RAX, QWORD PTR [RSP + 48] и т. Д.

Еще раз спасибо, Шут!

person OftenDeadKanji    schedule 31.12.2019