首页 > 解决方案 > 如何使用 MASM x64 将参数推入堆栈?

问题描述

我知道 x64 调用约定,前四个参数在rcx, rdx, r8, 中r9,其余的都在堆栈上。但我的问题是如何推动这些论点?

call_func PROC
    push rbp
    mov rbp, rsp

    mov rbx, rcx ; move C function address to rbx

    mov rcx, 1   ; some dummy value
    mov rdx, 2   ; some dummy value
    mov r8,  3   ; some dummy value
    mov r9,  4   ; some dummy value

    ; and now I want to push fifth argument, but how?

    call rbx     ; call the function

    mov rsp, rbp
    pop rbp

    ret
call_func ENDP

我已经尝试过mov QWORD PTR [rsp + 20h], 1,但是当从这个 asm 函数返回时,RIP 寄存器设置为奇怪的值,比如 0x0000000000000001。我知道RIP寄存器是指令指针,但是为什么要修改它呢?
我又尝试了一件事,让函数接受 6 个参数,当我像mov QWORD PTR [rsp + 28h], 1应用程序一样传递第六个参数时,传递了第六个参数,第五个有奇怪的值。

标签: cassemblymasm

解决方案


正如Jester所说,在推送参数之前,我需要为这些参数分配空间,包括shadow space
最终工作代码:

call_func PROC
    push rbp
    mov rbp, rsp
    sub rsp, 32  ; allocate shadow space 'padding'
    sub rsp, 16  ; allocate space for fifth and sixth argument

    mov r11, rcx ; move C function address to r11

    mov rcx, 1   ; some dummy value
    mov rdx, 2   ; some dummy value
    mov r8,  3   ; some dummy value
    mov r9,  4   ; some dummy value

    mov QWORD PTR [rsp + 20h], 5  ; push fifth argument
    mov QWORD PTR [rsp + 28h], 6  ; push sixth argument

    call r11     ; call the function

    mov rsp, rbp
    pop rbp

    ret
call_func ENDP

推荐阅读