首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用MASM x64将参数推送到堆栈?

如何使用MASM x64将参数推送到堆栈?
EN

Stack Overflow用户
提问于 2021-09-05 12:42:34
回答 1查看 70关注 0票数 0

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

代码语言:javascript
运行
复制
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寄存器被设置为奇怪的值,如0x000000000000000001。我知道RIP寄存器是指令指针,但它为什么要修改它?

我又尝试了一件事,让函数接受6个参数,当我传递像mov QWORD PTR [rsp + 28h], 1这样的第六个参数时,应用程序是正常的,第六个参数被传递,第五个参数有奇怪的值。

EN

回答 1

Stack Overflow用户

发布于 2021-09-05 13:27:02

正如Jester所说,在推送参数之前,我需要为这些参数分配空间,包括shadow space

最终工作代码:

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69063481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档