首页
社区
课程
招聘
汇编语言64位调用规范。什么是32字节的影子空间什么作用

x64调用规范
第3行
调用者的责任,还包括在运行时堆栈分配至少32字节的影子空间,这样被调用的过程就可以选择将计算器参数保存在这个区域中。
问题这里的影子空间32字节,我咋没看出来是啥意思以及它们的作用。 %20%20%20

收藏
3条回答
加油吧 2021-7-26

我自己答吧 终于明白了、、预留32字节的影子空间 其实是在调用系统外部链接库和 和 其他外部库时 用的 而一般自定义的调用过程 不用如此。因为 在自定义的过程里其实是没必要的 因为 可以在过程里直接 PUSH XXX然后结束时在POPXXX 堆栈就复原了(在过程运行完时一般必须如此)例如
we proc
push rax
push rbx
.... ....
pop rbx
pop rax
ret
we endp

 

而调用外部链接库过程时。因为无法改动外部库的过程中的内容。所以在调用库过程之前无法保证PUSH 使用之后调用外部库过程返回后 PUSH指令的 堆栈顺序还能对上之前的 PUSH和POP成对使用。 因为无法保证在外部过程中PUSH和POP的成对使用。。而临时保存寄存器内容在不适用全局变量的情况下 对RSP指针的所在堆栈内存地址进行手动地址下移 预留出空间 然后使用 直接寻址方式 来访问预留的堆栈空间是最好的且不出意外的方式而且 调用外部过程是有规范的。。(只使用4个寄存器往外部库过程传递参数更多的使用堆栈而堆栈等下可以手动恢复指针地址废掉数据还原RSP地址到之前的正确位置)所以只需要使用4个64位寄存器 4乘以8字节等于32字节。。所以预留32字节的影子空间使用直接寻址方式访问 在恢复 4个传递参数的寄存器之后 就可以手动 使用命令 ADD rsp ,xxx 之类的命令 恢复堆栈RSP指针 使其复原

回复
加油吧 2021-7-26 2021-7-26编辑

其实就是主调程序 为被调用程序预留的 4个 64位存储空间 可通过_直接寻址方式**_访问。。这是WINDOWSAPI 64 的规范。具体用不用如何使用是 WINDOWS API 的事情(外部调用过程 无法自己修改)一般来说是用来暂存 传递参数的寄存器的值得 腾出来寄存器 以便 外部库过程使用。且外部库过程使用堆栈结束后需清除所有参数使用的堆栈空间和影子空间 需把堆栈指针复原到RSP指针未因为外部库过程而被修改之前的地址。

回复
黑洞yyh 2025-5-23

影子空间的作用是为了入栈的参数能顺序一致,说简单点,就是前4个是通过rcx,rdx,r8,r9传递,而后面的是用入栈的形式,也就是说没有影子空间的化,获取参数就是得从寄存器和栈这边取,而有影子空间就不用,直接从栈中获取即可,因为预留得32字节空间,是存放了数据副本,所以目前我猜测就是入栈的时候能与以前win32时候一样,都是以栈传递,方便管理。其实它就是把那四个寄存器的值复制到栈中,然后顺序搞好就是所有参数从右往左入栈一样。八成是为了兼容win32用或者其他平台,反正作用没那么重要,重要是知道这货怎么用就行。平衡栈,要怎么平衡

回复