Dodać 2 liczby 128 bitowe, 1 liczba w komórkach pamięci od 0000, 2 liczba od 0010, a wynik ma być zapisany w komórkach od 0020.
Proszę o rozwiązanie tego. Wiem raczej o co chodzi, ale mam problem z adresowaniem pamięci i mylą mi się bardziej znaczące z mniej znaczącymi bitami, przez co nie wiem dokładnie gdzie mam wyniki umieszczać. [???]
A i jeszcze jedno; przydałby się obszerny komentarz do kodu :-/
xor bx, bx ; zerowanie bx <i>/adres pierwszej liczby/</i> i CF /flage przeniesienia/
mov cx, 8 ; liczba powtorzen
_petla:
mov ax, [bx] ; 16bit czesc pierwszej liczby
adc ax, [bx+0x10] ; + 16bit czesc drugiej + przeniesienie
mov [bx+0x20], ax ; zachowanie wyniku
inc bx ; zwiekszenie bx o 2, inc nie zmienia CF
inc bx
loop _petla
Liczby na x86 są zapisywane jako little-endian, najniższy bajt jako pierwszy, tutaj też będziemy się tego trzymać przy liczbach 128bit. Jako, że na 8086 /bo pod taki procesor pewnie ma to być napisane/ największym możliwym rozmiarem danych jest word - 16bit to będzie trzeba liczyć po kawałku. Aktualny kawałek = suma kawałków dwóch liczb + przeniesienie z poprzedniego dodawania. Użycie xor'a zamiast mov bx, 0 ma kilka plusów - instrukcja jest krótsza i, co ważniejsze, zeruje flagę przeniesienia. Liczby są ustawione ze stałym przesunięciem względem siebie więc wystarczy adresować względem aktualnego fragmentu pierwszej /rejestr bx/. Dwukrotna inkrementacja przesuwa wskaźnik na następną cześć liczb, inc w przeciwieństwie do add nie modyfikuje flagi przeniesienia - odpada nam zapamiętywanie stanu flag /loop też na nie nie wpływa/. Loop powoduje wykonanie kodu cx-razy, u nas 8 - 128/16.
I jeszcze jedno, '0x' to w cywilizowanych assemblerach prefiks liczby szesnastkowej, etykieta pętla jest zaś pod przesunięta względem początku kodu +5.
Dzięki za tak szybką odpowiedź. Ślę wyrazy uznania dla Ciebie. Widać znasz się na rzeczy. Teraz już rozumiem nareszcie tę kolejność. Pozdrawiam.