Created
December 15, 2012 13:24
-
-
Save soltys/4294962 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
unsigned char a,b; //char'y są 8 bitowe (patrz treść zadania) | |
unsigned short int wynik = 0; // short int 16 bitowy (patrz treść zadania) | |
a=12; //Ustawiamy dwie wartości które chcemy przemnożyć | |
b=8; | |
//Rozpoczynamy wstawkę assemblerową | |
_asm | |
{ | |
mov dx,0 //kolejne sumy a << coś będziemy przechowywać w dx (patrz wzór) | |
mov bl, b //kopiujemy do bl wartość zmiennejb | |
mov cl, 0x00 //cl będzie przechowywać wykładnik potęgi 2 (patrz wzór) | |
multi_loop: //etykieta służy później do przeskoków | |
shr bl, 1 // przesuwamy bl czyli kopię naszej zmiennej o jeden bit w prawo | |
// wartość na pozycji zerowego bitu (najbardziej na prawo) | |
// wchodzi do flagi pożyczki (ang. carry flag) | |
// dzięki temu wykonujemy dalsze przeskoki (ang. jumpy) | |
jc multiply //jeżeli właśnie ustawiliśmy flagę pożyczki na 1 | |
//wykonaj przeskok do etykiety o nazwie multiply | |
//jeżeli flaga pożyczki jest ustawiona na zero | |
//to ta instrukcja nic nie robi | |
jz end_multi //Jeżeli wyniku ciągłego przesuwania b wyzerowaliśmy b | |
//to oznacza koniec mnożenia (nie ma już w b żadnych jedynek) | |
jnc next_bit //To przypadek w którym nie wyzerowaliśmy b | |
//oraz w bicie zerowym znajduje się zero | |
//czyli przeskakujemy do next_bit | |
multiply: | |
mov al, a //kopiujemy wartość a do rejestru al | |
shl al, cl //wykonujemy al=al*2^cl | |
cbw //abyśmy mogli przekazać wartość z rejestru 8 bitowego | |
//do rejestru 16 bitowego musimy 'rozszerzyć' rejestr al | |
//aby zajmował wielkość 16 bitową | |
//do ax zostaje przypisana wartość al | |
add dx, ax // wykonywanie dodawania jednego z czynników | |
next_bit: | |
inc cl //zwiększamy o jeden wykładnik potęgi | |
jmp multi_loop // wykonujemy bezwzględny skok do multi_loop | |
end_multi: | |
mov wynik, dx //Przypisujemy wartość dx do wyniku | |
} //Kończymy algorytm. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment