;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
我似乎无法弄清楚为什么这没有除法,我收到错误“浮点异常”我使用的是 64 位机器,并且值是整数而不是浮点......想法?
我知道除法发生后商应该在 rax 中,我相信余数应该在 rdx 中,但截至目前我只是想掌握商。
你的函数对我来说看起来有点复杂。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)
您是否可能会踩踏您的参数并在此过程中混淆一些东西?
编辑:查看您的代码,我发现它可能根本没有被编写为正确的函数。重要的步骤是:
- 将股息放入 RDX:RAX - 对您来说,这可能意味着清除 RDX 并将输入股息放入 RAX。
- 将除数放在其他寄存器中 - 你选择了 RCX,那应该没问题。
- 划分-
idiv rcx
.
- 结果将在 RAX 中。
您应该特别注意第 1 步 - 确保 RDX:RAX 具有正常的内容!我无法从您显示的代码中猜测为什么您会收到浮点异常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)