64位鼻子师idiv

时间:2012-01-13 22:27:59

标签: assembly x86-64 nasm

;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中我相信,但是现在我只是试图抓住商。

2 个答案:

答案 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)

您是否可能会踩踏您的参数并在此过程中混淆某些内容?

编辑:查看你的代码,我发现它可能根本不是一个正确的函数。重要的步骤是:

  1. 将红利放入RDX:RAX - 对您而言,可能意味着清算RDX并将输入红利放入RAX。
  2. 将除数放在其他寄存器中 - 你选择RCX,应该没问题。
  3. 分割 - idiv rcx
  4. 结果将在RAX中。
  5. 你应该特别注意第1步 - 确保RDX:RAX有健全的内容!为什么你得到一个浮点异常,我无法从你所显示的代码中猜出来。

答案 1 :(得分:1)

你实际上在RCX中划分了RDX:RAX中的128位数字。因此,如果RDX未初始化,结果可能会大于64位,从而导致溢出异常。尝试在划分之前添加CQO以将RAX签名扩展到RDX。

我无法解释浮点位,也许有人决定在某个地方重用一个中断向量用于泛型数学错误?