Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Czy MMX przekłamuje? Dodawanie liczb hex. Błędy.

30 Lip 2007 02:23 1204 2
  • Poziom 33  
    Witam

    Napisałem mały programik dodający liczby hex za pośrednictwem rejestrów MMX. Działa, ale występują błędy. Podam przykłady (oczywiście wszystkie liczby hex):

    12345678 + 1 = 12345679
    12345678 + 2 = 1234567A

    ... itd. Działa dobrze aż do:

    12345678 + 88 = 12345600 ; wg kalkulatora powinno być 12345700

    i tak aż do 99. Po przejściu do 100 znów jest dobrze.

    12345678 + 100 = 12345778

    12345678 + 12345678 = 2468ACF0 ;zgodne z kalkulatorem

    Nie sposób oczywiście sprawdzić wszystkich kombinacji, ale to złapałem. Co jest przyczyną?

    Kawałek kodu:



    Code:

            mov ecx, 16
       mov ebx, ecx   ; ebx = liczba bajtów
       and ebx, 7                   ; będziemy brać po 8 bajtów - obliczamy
                                        ; więc resztę z dzielenia przez 8

       shr ecx, 3                   ; dzielimy ecx przez 8

       lea esi, Bufor3
       lea edx, Bufor4
       lea edi, Bufor5


    petla:
    Code:

       movq mm0, [esi]   ; pobierz 8 bajtów z pierwszej tablicy
       paddb mm0, [edx]     ; dodaj 8 spakowanych bajtów z drugiej
       movq [edi], mm0   ; zapisz 8 bajtów w tablicy docelowej
       add edx, 8    ; zwiększ indeksy do tablic o 8
       add esi, 8
       add edi, 8
       loop petla     ; działaj, dopóki ECX różne od 0.

       test ebx, ebx   ; czy EBX = 0?
       jz koniec       ; jeśli tak, to już skończyliśmy

       mov ecx, ebx   ; ECX = resztka, co najwyżej 7 bajtów.
             ; te kopiujemy tradycyjnie

    petla2:
    Code:

       mov al, [edx]   ; pobierz bajt z pierwszej
       add al, [esi]   ; dodaj bajt z drugiej
       mov [edi], al   ; zapisz bajt w docelowej
       inc edx      ; zwiększ o 1 indeksy do tablic
       inc esi
       inc edi
       loop petla2    ; działaj, dopóki ECX różne od 0

    koniec:

    Code:
       emms      ; wyczyść rejestry MMX



    Kod zamieszczony w znacznikach code jest bardziej czytelny.
    charm_spider
  • Pomocny post
    Poziom 19  
    pamiętaj że dodajesz 8 spakowanych bajtów i dostajesz overflow'a przy $78+$88 wzwyż.
  • Poziom 33  
    Dzieki za odpowiedź. Z tego co napisałeś i z opisu co oznacza "spakowane bajty" wynika, że instrukcje MMX są nieprzydatne do moich celów. W materiałach teoretycznych jest napisane:

    "Zwykła arytmetyka (ang. wraparound), w której przekroczenie zakresu nie jest w żaden sposób sygnalizowane - zapisywane są tylko najmłodsze bity, które mieszczą się w słowie wynikowym."

    Usiłuję napisać "na piechotę" procedury konwersji hex/dec i dec/hex liczb większych niż dword. Nie mam nawet koncepcji jak to się robi. Po prostu chciałbym zrobić kalkulator arytmetyczny podobny do Windows'owego, ale o większych możliwościach.