x64调用规范第3行调用者的责任,还包括在运行时堆栈分配至少32字节的影子空间,这样被调用的过程就可以选择将计算器参数保存在这个区域中。问题这里的影子空间32字节,我咋没看出来是啥意思以及它们的作用。 %20%20%20
我自己答吧 终于明白了、、预留32字节的影子空间 其实是在调用系统外部链接库和 和 其他外部库时 用的 而一般自定义的调用过程 不用如此。因为 在自定义的过程里其实是没必要的 因为 可以在过程里直接 PUSH XXX然后结束时在POPXXX 堆栈就复原了(在过程运行完时一般必须如此)例如we procpush raxpush rbx.... ....pop rbxpop raxretwe endp
而调用外部链接库过程时。因为无法改动外部库的过程中的内容。所以在调用库过程之前无法保证PUSH 使用之后调用外部库过程返回后 PUSH指令的 堆栈顺序还能对上之前的 PUSH和POP成对使用。 因为无法保证在外部过程中PUSH和POP的成对使用。。而临时保存寄存器内容在不适用全局变量的情况下 对RSP指针的所在堆栈内存地址进行手动地址下移 预留出空间 然后使用 直接寻址方式 来访问预留的堆栈空间是最好的且不出意外的方式而且 调用外部过程是有规范的。。(只使用4个寄存器往外部库过程传递参数更多的使用堆栈而堆栈等下可以手动恢复指针地址废掉数据还原RSP地址到之前的正确位置)所以只需要使用4个64位寄存器 4乘以8字节等于32字节。。所以预留32字节的影子空间使用直接寻址方式访问 在恢复 4个传递参数的寄存器之后 就可以手动 使用命令 ADD rsp ,xxx 之类的命令 恢复堆栈RSP指针 使其复原
其实就是主调程序 为被调用程序预留的 4个 64位存储空间 可通过_直接寻址方式**_访问。。这是WINDOWSAPI 64 的规范。具体用不用如何使用是 WINDOWS API 的事情(外部调用过程 无法自己修改)一般来说是用来暂存 传递参数的寄存器的值得 腾出来寄存器 以便 外部库过程使用。且外部库过程使用堆栈结束后需清除所有参数使用的堆栈空间和影子空间 需把堆栈指针复原到RSP指针未因为外部库过程而被修改之前的地址。