是否有程序转换或编译技术可以删除潜在的运行时异常,例如div by 0,浮点溢出/下溢等。我希望在CPU生成它们之前处理程序中的潜在异常。此外,我想要在x64机器代码级别表达的转换。
例如,为了消除CPU生成div by 0
的可能性,我可以在调用div
指令之前检查除数是否为0,如下所示。
cmp rcx 0
jz my_handler //some routine I wrote
div rcx
但是,目前尚不清楚如何为浮点异常实现此技术,尤其是下溢和溢出。检查溢出不会导致溢出吗? 我意识到语言支持异常处理,但我的用例需要这个。
答案 0 :(得分:2)
是否有可能让CPU甚至无法生成FP异常
是的,这是大多数操作系统的默认情况,其中x87控制字和MXCSR中的所有屏蔽位都已设置。如果你不确定某些自定义操作系统,可以很容易地将它们全部设置在main()
的顶部。
检查两种情况是否足够:1)除数不为0,2)除数和被除数分别不是-1和INT_MIN?
没有。不,DIV和IDIV做128b / 64b => 64b除法(或64/32 => 32)。如果RDX不为零(DIV)或使用来自RAX(IDIV)的CQO设置,则很容易发生除法错误。
但如果您只是将它用于64b / 64b => 64b分区就像编译器一样,然后是的,唯一的例外情况是有限的。
x/0
代表DIV和IDIV LONG_MIN / -1
IDIV Minimum Values to Cause idiv Instruction to Overflow in x86 Assembly