【发布时间】:2017-08-18 00:14:15
【问题描述】:
我试图将859091 除以11 以获得商和余数,但我在线得到浮点异常:
div bx
这是我的 SASM 代码:
%include "io.inc"
section .data
dividend dd 859091
divisor dw 11
section .text
global CMAIN
CMAIN:
push ebp
mov ebp, esp
xor eax, eax
xor ebx, ebx
xor edx, edx
mov ax, word [dividend]
mov dx, word [dividend + 2]
mov bx, word [divisor]
test bx, bx
jz exit
div bx
exit:
leave
ret
【问题讨论】:
-
dx:ax 除以 bx 的商不适合 16 位寄存器(ax 是商所在的位置),因此您会遇到异常。 859091/11=78099。可以放入 16 位的最高无符号值是 65535。也许使用 32 位寄存器进行除法?
-
要将内存中的 32 位双字除以内存中的 16 位字,您可以这样做
movzx ebx, word [divisor]test ebx, ebxjz exitjz exitxor edx, edxmov eax, [dividend]div ebx -
浮点异常 (SIGFPE) 是算术异常的全部捕获,而不仅仅是浮点异常。该错误有点欺骗性。如果它是“算术异常”恕我直言,那就更好了。在 x86 除法溢出和除以零映射到相同的硬件异常。 single unix specification 现在对 SIGFPE 这么说:SIGFPE 错误的算术运算。
标签: assembly x86 nasm division floating-point-exceptions