2012-01-13 129 views
3
;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位機器,值是整數不浮動點....想法?64位nasm部門idiv

我知道分割發生後商應該是rax,其餘的應該在rdx我相信,但現在我只是試圖讓我的手在商。

+0

的[NASM X86-64位除法](http://stackoverflow.com/questions/8845191/nasm-x86-64-bit-division) – 2012-01-14 16:18:41

回答

7

你的函數看起來複雜,我一點點。 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

  1. 認沽分紅:RAX - 你這可能意味着清理出RDX,並把輸入股息RAX。
  2. 把除數放在其他一些寄存器中 - 你選擇了RCX,應該沒問題。
  3. 鴻溝 - idiv rcx
  4. 結果將在RAX。

您應該特別注意第1步 - 確保RDX:RAX具有健全的內容!爲什麼你會得到一個浮點異常,我無法從你展示的代碼中猜出。

+0

,這是它的引導步驟幫助很多,我沒有清除rdx寄存器之前,非常感謝! – user1050632 2012-01-13 22:50:08

+0

你爲什麼在nasm中使用r8?它需要嗎? – Nande 2015-10-27 21:28:44

+1

@Nande,不適用於NASM,但適用於windows abi,​​其中rdx是參數傳遞寄存器。 – 2015-10-28 00:35:49

1

你實際上除以RDX一個128位的數字:RAX由RCX。所以如果RDX未初始化,結果可能會大於64位,導致溢出異常。嘗試在部門之前添加CQO以將RAX簽名擴展爲RDX。

我無法解釋浮點位不過,也許有人決定重新使用通用的數學錯誤的路線某處中斷向量?

+0

供將來參考,可能重複的哪裏找到一個像'CQO指令'?在GAS語法中,它是'cqto',它看起來不清楚它應該在MASM語法中轉換成什麼。 – Vortico 2014-01-11 00:39:55

+0

@Vortico:英特爾架構手冊(http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)始終是一個良好的開端。至於具體CQO我承認我不知道的128位字適當的後綴,但不得不尋找CBW/CWD/CDQ,看看64位等效可能被稱爲 – doynax 2014-01-11 01:04:34