Mnożenie dużych liczb

0

Witam,
na wstępie zaznaczę, że moja wiedza asemblerowa jest raczej niewielka. Mam za zadanie napisać program mnożący dwie duże liczby np. 64 bitowe. Wiem, że trzeba to będzie zrobić podobnym sposobem jak mnożenie pisemne
A B C D
*P Q R S

                D*S
                 C*S
              B*S
               A*S
                 D*R
              C*R
               B*R
            A*R
              D*Q
               C*Q
            B*Q
         A*Q
               D*P
            C*P
         B*P
        + A*P
    =
           F  G  H  I  J  K  L

jednak nie wiem nawet jak zadeklarować dwie zmienne o takiej wielkości i potem jak brać po kolei te liczby żeby je mnożyć i wyniki sumować;/
Proszę o pomoc ;s (skladnia x86)

0

Robisz to podobnie jak w C++, czyli deklarujesz tablice. W asemblerze masz jednak ciut wygodniej, bo masz dostęp do instrukcji ADC (Add with Carry), tzn jeżeli przy dodawaniu nastąpi przekręcenie licznika to ustawiana jest flaga przeniesienia (Carry Flag). ADC a, b działa prawie tak samo jak ADD a, b, tylko jeszcze dodaje wartość flagi przeniesienia.

0
Wibowit napisał(a)

Robisz to podobnie jak w C++, czyli deklarujesz tablice. W asemblerze masz jednak ciut wygodniej, bo masz dostęp do instrukcji ADC (Add with Carry), tzn jeżeli przy dodawaniu nastąpi przekręcenie licznika to ustawiana jest flaga przeniesienia (Carry Flag). ADC a, b działa prawie tak samo jak ADD a, b, tylko jeszcze dodaje wartość flagi przeniesienia.

Programming from the ground up mówi:

addl
I/R/M, R/M
O/S/Z/A/P/C
Addition. Adds the first operand to the second, storing the result in the second. If the result is
larger than the destination register, the overflow and carry bits are set to true. This instruction
operates on both signed and unsigned integers.

adcl
(...)

For the usual case, this is not used, and addl is used instead.

ja ostatnio na zajęciach też miałem podobne zadanie i add mi wystarczyło. właśnie, @pjski: gdzie studiujesz? ;) bo zadanie brzmi strasznie znajomo

0

Jeżeli mam dwie liczby 64-bitowe bez znaku, w rejestrach odpowiednio eax:ebx i ecx:edx to za pomocą add i adc mogę je dodać tak:

add ebx, edx
adc eax, ecx

Napisz mi teraz jak to zrobisz bez użycia adc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0