【问题标题】:How to push arguments onto stack using MASM x64?如何使用 MASM x64 将参数推入堆栈?
【发布时间】:2021-11-02 21:22:41
【问题描述】:

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

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 这样的第六个参数时,应用程序很好,传递了第六个参数,第五个有奇怪的值。

【问题讨论】:

  • 这样做会覆盖堆栈中较高的值。你应该看看push 指令。
  • 您需要先分配堆栈,包括空间影子空间。例如。做sub rsp, 48 然后你可以使用你的mov QWORD PTR [rsp + 20h], 1
  • @Jester 谢谢,现在它可以工作了,很奇怪,因为我之前尝试过这个,但可能没有mov QWORD PTR [rsp + 20h], 1

标签: c assembly masm


【解决方案1】:

正如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

【讨论】:

  • 没有理由使用两个sub 指令。更重要的是,rbx 是被调用者保存的寄存器,你不应该将它用于临时。
  • 我知道,对于像我这样的新手来说,它更干净。你说得对,我忘了rbx,但我想我可以把它压入堆栈然后弹出它?
  • 你可以,但你必须担心对齐。您确实有一个额外的堆栈槽可用,因为您只使用 5 个参数。无论如何,最简单的方法是选择另一个不需要保留的寄存器。
  • 一种快速而简单的替代方案:将前四个参数加载到它们的寄存器中,对齐 RSP,然后在 CALL 之前对齐 PUSH Sixth, Fifth, R9, R8, RDX, RCX
  • 如果你愿意,可以写sub rsp, 32 + 16 ; shadow space + arg space
猜你喜欢
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多