;print out division message
mov rcx, 0 ;zero out register
mov rax, [input]
mov rcx, [input2]
idiv rcx ;divide rax by rcx
mov rdi, rax ;for printing purposes
call print_int
我似乎无法弄清楚为什么这不是分裂,我得到一个enrror“浮点异常”我使用64位机器,值是整数而不是浮点....想法?
我知道在分裂发生之后,商应该在rax中,而余数应该在rdx中我相信,但是现在我只是试图抓住商。
答案 0 :(得分:8)
你的功能看起来有点复杂。 idiv
使用此函数可以正常工作:
_mydiv:
xor %rdx, %rdx ; clear high bits of dividend
mov %rdi, %rax ; copy dividend argument into rax
idiv %rsi ; divide by divisor argument
ret ; return (quotient is in rax)
转换为NASM语法和windows ABI,我认为这将是:
_mydiv:
mov r8, rdx ; copy divisor argument to scratch register
xor rdx, rdx ; clear high bits of dividend
mov rax, rcx ; copy dividend argument into rax
idiv r8 ; divide by divisor in scratch register
ret ; return (quotient is in rax)
您是否可能会踩踏您的参数并在此过程中混淆某些内容?
编辑:查看你的代码,我发现它可能根本不是一个正确的函数。重要的步骤是:
idiv rcx
。你应该特别注意第1步 - 确保RDX:RAX有健全的内容!为什么你得到一个浮点异常,我无法从你所显示的代码中猜出来。
答案 1 :(得分:1)
你实际上在RCX中划分了RDX:RAX中的128位数字。因此,如果RDX未初始化,结果可能会大于64位,从而导致溢出异常。尝试在划分之前添加CQO以将RAX签名扩展到RDX。
我无法解释浮点位,也许有人决定在某个地方重用一个中断向量用于泛型数学错误?