logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[assembler] dzielenie 2 liczb 64bitowych na rejestrach 32bit

donnied 06 Kwi 2010 22:34 2468 3
REKLAMA
  • #1 7929147
    donnied
    Poziom 2  
    Posty: 3
    Ocena: 2
    witam, musze zrobic dzielenie 2 doubli, czyli musze podzielic dwie mantysy 52bitowe. Nie moge uzyc koprocesora, wiec pozostaja rejestry 32bitowe. Probowalem trzymac jedna mantyse w 2 rejesrach (eax, ebx) w jednej byly by 32 bity w drugiej 20. Z druga tak samo. Uzylem algorytmu dzielenia przez odejmowanie, pomijajac fakt, ze jeszcze nie dziala tak jak powinien zatanawiam sie czy dobrze to rozumuje.

    Zobrazuje to na prostym przykladzie. Mamy 7:3, wiec to jest 2 i zostaje nam 1, no ale zeby reszta byla reszta to 1/3 wiec 0.33.. No i urok dzielenia przez odejmowanie ma do siebie to (chyba, ze zle zrozumialem) ze nasza reszta to ta 1, wiec trzeba to jeszcze podzielic przez dzielnik czyli 3.

    No i przekladajac to na moj problem 7 to jedna mantysa w 2 rejestrach i 3 to jedna mantysa tez w 2 rejestrach. Wartosc "2" mam ladnie zapisana, ta "1" zalozmy tez, tylko musze ja podzielic przez "3" ktora przeciez jest w dwoch rejestrach.. bledne kolo?

    Nie licze o kod tylko o sposob jak to rozwiazac, jakim algorytmem? mam nadzieje, ze jakos to w miare wytlumaczylem..
  • REKLAMA
  • #2 7929774
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Nie dziel 1/3, tylko 100/3 albo 1000/3 (oczywiście w systemie binarnym przesunięcie musi być w oparciu o właśnie system binarny dokonane)... Dokonaj takiej normalizacji, aby otrzymać liczbę całkowitą, w której tylko wystarczy przesunąć przecinek.

    Tak więc przed przystąpieniem do dzielenia zmaksymalizuj mantysę dzielnej i zminimalizuj dzielnika, dbając o to, by nie przekroczyć zakresu cech. Jednocześnie pamiętaj sumę przesunięć. Później wystarczy podzielić całkowicie i ustawić cechę właściwie do cech obu czynników oraz tego własnego licznika.
  • REKLAMA
  • #3 7933835
    donnied
    Poziom 2  
    Posty: 3
    Ocena: 2
    co rozumiesz poprzez maksymalizacje/minimalizacje?

    zalozmy ze moje mantysy to FFFFFFFFFFFFF i AAAAAAAAAAAAA

    i to siedzi tak w rejestrach
    eax FFFFFFFF
    ebx 000FFFFF
    ecx AAAAAAA
    EDX 00AAAAA

    i co rozumiesz w tym przypadku przez maksymalizacje/minimalizacje?
  • #4 7934022
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    dziel FFFFFFFFFFFFF000 przez 00000AAAAAAAAAA - ucierpi nieco dokładność, ale jest to do wykonania na 64 bitach ALU. Wynik przesuń o 6 w prawo (otrzymasz 6 miejsc binarnych po przecinku, oczywiście przesunięcia dokonujesz modyfikując cechę wyniku).

    Generalnie dzielenie np liczb 32 bitowych na FPU odbywa się w rzeczywistości z wykorzystaniem 96 bitów, jeśli dobrze pamiętam. Generalnie zawsze takie operacje przeprowadzane są na większych zakresach, aby nie gubić dokładności. Tak więc jeśli chcesz podzielić liczby 64bitowe przy wykorzystaniu wyłącznie rejestrów, to niestety, ale musisz zgubić dokładność.

    Załóżmy, że dajesz dziecku do wykonania dzielenie 3/13. Załóżmy, że ono nie zna ułamków i może operować na liczbach wyłącznie z zakresu 1000. Takiego dzielenia nie wykona, ale wykona już dzielenie 300/13 = ~23. Ty wiesz, że wystarczy przesunąć przecinek o 32 w prawo i masz swój wynik = 0,23. Jeśli chcesz, możesz próbować uzyskać więcej miejsc, lecz z miejszą dokładnością: 300/1 = 300 i 3 w prawo = ~0,3. Grunt, to wiedzieć ile i gdzie można przesunąć, by móc to wykorzystać. (ze względu na małe zakresy różnice wydają się olbrzymie, lecz przy większych zakresach nie będzie aż takiej rozbieżności)
REKLAMA