跟ABI有关
MS针对x64规定了一套ABI,把异常处理的信息静态存储在64位PE文件的IMAGE_DIRECTORY_ENTRY_EXCEPTION这个位置的表里,里面有unwind chain。一般是编译器负责生成这个表。
发生异常时(比如调用RaiseException()这个OS API来抛出异常),OS可以根据这个表进行异常派发,然后可以调用和语言相关的异常处理程序,比如C++的__CxxFrameHandler3、__CxxFrameHandler4等。
自己手写汇编代码的话,只要遵循这个ABI,也是可以正常处理异常的。
JIT动态生成的代码的话,有对应的OS API RtlInstallFunctionTableCallback()/RtlAddFunctionTable()可以动态注册异常处理信息。
ARM32 ABI和32-bit x86差不多,都是用代码动态生成SEH链。
ARM64 ABI和x64差不多。
还有一个ARM64EC ABI,用于ARM64和x64的交互,win11 on arm用的。
【 在 hgoldfish 的大作中提到: 】
: 为啥 amd64 架构能做到这样。是 CPU 特别处理的吗?
: arm32 和 arm64 有没有这样的区别?
:
--
FROM 222.128.162.*