从程序中删除异常

时间:2016-10-12 14:48:33

标签: compilation floating-point x86 64-bit cpu-architecture

是否有程序转换或编译技术可以删除潜在的运行时异常,例如div by 0,浮点溢出/下溢等。我希望在CPU生成它们之前处理程序中的潜在异常。此外,我想要在x64机器代码级别表达的转换。

例如,为了消除CPU生成div by 0的可能性,我可以在调用div指令之前检查除数是否为0,如下所示。

cmp rcx 0
jz my_handler //some routine I wrote
div rcx

但是,目前尚不清楚如何为浮点异常实现此技术,尤其是下溢和溢出。检查溢出不会导致溢出吗? 我意识到语言支持异常处理,但我的用例需要这个。

1 个答案:

答案 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
  • 如果从RAX设置RDX,则无法获得大于操作数大小的红利。

Minimum Values to Cause idiv Instruction to Overflow in x86 Assembly