你的函數看起來複雜,我一點點。 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語法和窗戶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具有健全的內容!爲什麼你會得到一個浮點異常,我無法從你展示的代碼中猜出。
的[NASM X86-64位除法](http://stackoverflow.com/questions/8845191/nasm-x86-64-bit-division) – 2012-01-14 16:18:41