c - 如何使用 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
应用程序一样传递第六个参数时,传递了第六个参数,第五个有奇怪的值。
解决方案
正如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
推荐阅读
- java - 我如何过滤此映射以生成更优雅和干净的 sql 更新?
- r - `/.default`(residuals, sigmas) 中的错误:不一致的数组
- javascript - 更新后以错误的 MIME 类型发送的 React Build Stylesheets 和 Js 文件
- google-apps-script - Getting the error note of a formula with #NA in google sheets for a script
- html - 样式化组件 (DIV) 上的 onClick 事件处理
- django - How can I run an existing Django application?
- ruby-on-rails - ERROR: Error installing rails zeitwerk requires Ruby version >= 2.4.4
- python - 发送邮件时显示错误,例如,AttributeError: 'int' object has no attribute 'splitlines'
- google-cloud-platform - 在 gcloud 中将 JSON 文件作为环境变量传递
- amazon-web-services - 如何将消息发送到不同 AWS 账户中的 SQS 队列?