pwy1545146949 发表于 2024-3-9 21:09

loadlibraryA与rsp的问题

突然发现,在调用LoadLibraryA时,rsp用十六进制数表示,rsp的最后一位若是8,那么程序会崩溃,rsp的最后一位是0,就正常执行,我测试了GetModuleHandle,不会出现这种情况,这算是bug吗

苏紫方璇 发表于 2024-3-9 22:34

应该不会,函数是否正常执行和堆栈指针末尾数字无关

爱飞的猫 发表于 2024-3-10 05:51

本帖最后由 爱飞的猫 于 2024-3-10 10:23 编辑

不是 bug,是 x64 在调用函数前需要对齐堆栈的一个特性。

> 堆栈将始终保持 16 字节对齐,以下两种情况除外:一是在 Prolog 中(例如,推入返回地址之后);二是在帧函数特定类的函数类型中指示的位置。
>
> 大多数结构都按其自然对齐方式对齐。 主要的例外是堆栈指针和 `malloc` 或 `alloca` 内存;为了提高性能,它们对齐到 16 字节。

[参考1 - 堆栈分配](https://learn.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2008/ew5tede7(v=vs.90))、[参考2 - x64 调用约定](https://learn.microsoft.com/zh-cn/cpp/build/x64-calling-convention?view=msvc-170#alignment)

pwy1545146949 发表于 2024-3-10 18:18

爱飞的猫 发表于 2024-3-10 05:51
不是 bug,是 x64 在调用函数前需要对齐堆栈的一个特性。

> 堆栈将始终保持 16 字节对齐,以下两种 ...

确实是这样
页: [1]
查看完整版本: loadlibraryA与rsp的问题