2012-01-31 59 views
1

嘗試將正數除以負數。nasm idiv a負值

目前我計劃將正確劃分,我可以正確訪問的其餘部分。

但是當我inputa由負值被劃分正數,它不會分裂的。

我知道有一個方法來「符號擴展」,它會正確劃分。我只是不明白手動

movsss $ IMM /%REG%REG/MEM的舉動,簽署延長231個 movzss $ IMM /%REG%REG/MEM的舉動,零擴展

ofcourse這就是ATT語法,我需要Intel語法

這裏是我的代碼

xor rdx, rdx 
mov rax, [input] 
mov rcx, [input2] 
idiv rcx 

想法,如何通過負分?

+0

在做了一些研究之後,我還發現了一個可能做到這一點的指令「cdq」,但是還沒有工作 – user1050632 2012-01-31 01:15:05

回答

4

如果除數是一個符號的64位值,你不需要用它做任何事情。同樣,如果紅利是一個有符號的128位值,您不需要做任何事情,只需將它的前64位加載到rdx中,並將低64位加載到rax中。

現在,如果任何號碼的簽署,但短於idiv預期,就需要符號擴展該號碼。符號擴展非常簡單。您只需填寫數字的最高有效位(符號位)的空位。對於非負數字,用0填充空格,對於負數用1填充。有幾條可用的指令可以標記擴展累加器中當前保存的值。它們是:cbwcwdecdqecwdcdqcqo。最後三個符號延伸到dx/edx/rdx。最有可能你需要cqo,而不是xor rdx, rdx這樣的:

mov rax, [input] 
cqo ; sign extends rax into rdx:rax 
mov rcx, [input2] 
idiv rcx 

至於「但是,當我inputa正數由負值劃分,它不會在所有的分裂」,它不能。它要麼劃分或調用除法例外(除以0或溢出),沒有第三種選擇。

+0

cqo工作過!!!,我在嘗試cdq一段時間,但它沒有工作,偶然可以你把我指向你曾經弄清楚的來源? – user1050632 2012-01-31 01:18:33

+0

在本文檔中(來自amd.com):AMD64體系結構程序員手冊第3卷:通用和系統指令。 – 2012-01-31 01:43:44

+0

@ user1050632因爲已經有'cwd'(將單詞轉換爲雙字)和'cdq'(將double轉換爲四字),人們可以期待找到像cqo這樣的64位指令類似的命名。 – hirschhornsalz 2012-01-31 10:07:14