Kurs programowania w asemblerze
Przesunięcia, obroty i rozkazy logiczne
Operacje związane z tymi pojęciami są bardzo ważne, dlatego poświęciłem oddzielną stronę na ich omówienie. By sprawnie posługiwać się zawartymi tutaj opisami i instrukcjami powinieneś powtórzyć sobie lekcję systemu dwójkowego (binarnego). Każda liczba w postaci binarnej powinna być zakończona literą B.
Zacznijmy od przesunięć i obrotów. Wszystkie te operacje można wykonywać na rejestrach 8 i 16 bitowych. Drugim argumentem instrukcji jest zawsze cyfra 1 bądź zawartość rejestru CL. Trzeba tylko jeszcze przypomnieć, że kolejne pola bitowe rejestru są w następującej kolejności: 7,6,5,4,3,2,1,0 i że literka C oznacza znacznik rejestru znaczników, a dokładnie znacznik przesunięcia.
Instrukcje można używać w następujący sposób, np.:
MOV AL,15H MOV CL,2 SHL AL,CL
Do instrukcji związanych z obrotami i przesunięciami zaliczami:
| SHL rejestr lub zmienna, liczba | Przesunięcie logiczne w lewo |
| SAL rejestr lub zmienna, liczba | Przesunięcie arytmetyczne w lewo |
| SHR rejestr lub zmienna, liczba | Przesunięcie logiczne w prawo |
| SAR rejestr lub zmienna, liczba | Przesunięcie arytmetyczne w prawo |
| ROL rejestr lub zmienna, liczba | Obrót w lewo |
| RCL rejestr lub zmienna, liczba | Obrót w lewo z przeniesieniem |
| ROR rejestr lub zmienna, liczba | Obrót w prawo |
| RCR rejestr lub zmienna, liczba | Obrót w prawo z przeniesieniem |
Oto lista instrukcji logicznych:
| NOT rejestr lub zmienna | Negacja logiczna |
| AND rejestr lub zmienna, rejestr lub zmienna | Iloczyn logiczny |
| TEST rejestr lub zmienna, rejestr lub zmienna | Iloczyn logiczny bez zmiany operandów |
| OR rejestr lub zmienna, rejestr lub zmienna | Suma logiczna |
| XOR rejestr lub zmienna, rejestr lub zmienna | Różnica symetryczna |
Instrukcje SHL i SAL
| C | <-- | 7 | <-- | 6 | <-- | 5 | <-- | 4 | <-- | 3 | <-- | 2 | <-- | 1 | <-- | 0 | <-- | 0 |
|---|
Przesunięcie logiczne w lewo (SHL) i przesunięcie arytmetyczne w lewo (SAL). Znacznik C jest wyzerowany.
Przesunięcie logiczne w lewo jest szybszą instrukcją pozwalającą na mnożenie liczby przez potęgę liczby 2. By np. pomnożyć 4*8, należy napisać ciąg instrukcji:
MOV AL,4 ; 00000100B MOV CL,3 ; 2<sup>3</sup>=8<br> SHL AL,CL
Po wykonaniu tych instrukcji w rejestrze AL znajdzie się wartość 32 (00100000B) czyli 4*8=32. Zajrzyj do SHR
Instrukcja SHR
| 0 | --> | 7 | --> | 6 | --> | 5 | --> | 4 | --> | 3 | --> | 2 | --> | 1 | --> | 0 | --> | C |
|---|
Przesunięcie logiczne w prawo. Znacznik C zostaje ustawiony.
Przesunięcie logiczne w prawo jest często stosowane jako instrukcja do dzielenia przez potęgę liczby 2, gdyż jest dużo szybsza od innych podobnych instrukcji. By np. podzielić liczbę 32 przez 16 należy napisać ciąg instrukcji:
MOV AL,32 ; 0010000B MOV CL,4 ; 2<sup>4</sup>=16 SHR AL,CL
W rejestrze AL znajdzie się wartość 2 (00000010B) czyli 32/16. Zajrzyj do SHL
Instrukcja SAR
| bit 7 | --> | 7 | --> | 6 | --> | 5 | --> | 4 | --> | 3 | --> | 2 | --> | 1 | --> | 0 | --> | C |
|---|
Przesunięcie arytmetyczne w prawo. Znacznik C wyzerowany. Bit 7 jest powielany.
Instrukcja ROL
| C | <-- | 7 | <-- | 6 | <-- | 5 | <-- | 4 | <-- | 3 | <-- | 2 | <-- | 1 | <-- | 0 | <-- | bit 7 |
|---|
Obrót w lewo. Znacznik C zostaje wyzerowany.
Instrukcja RCL
| C | <-- | 7 | <-- | 6 | <-- | 5 | <-- | 4 | <-- | 3 | <-- | 2 | <-- | 1 | <-- | 0 | <-- | C |
|---|
Obrót w lewo z przeniesieniem. Znacznik C zostaje wyzerowany.
Instrukcja ROR
| bit 0 | --> | 7 | --> | 6 | --> | 5 | --> | 4 | --> | 3 | --> | 2 | --> | 1 | --> | 0 | --> | C |
|---|
Obrót w prawo. Znacznik C ustawiony.
Instrukcja RCR
| C | --> | 7 | --> | 6 | --> | 5 | --> | 4 | --> | 3 | --> | 2 | --> | 1 | --> | 0 | --> | C |
|---|
Obrót w prawo z przeniesieniem, znacznik C zostaje ustawiony.
Instrukcja NOT
Instrukcja wykonuje negację logiczna. Jej działanie polega na negowaniu każdego bitu argumentu, czyli zmianie wartości na przeciwną np.
MOV AX, 14B5H ; 0001010010110101B NOT AX
Wynikiem powyższych instrukcji jest wartość AX=0EB4AH (1110101101001010B)
Instrukcja AND
Instrukcja wykonuje iloczyn logiczny. Parametrami jej mogą być rejestry, zmienne lub wartości liczbowe. Iloczynowi logicznemu podlegają odpowiadające sobie bity obu parametrów. Po wykonaniu tej instrukcji znaczniki C i O zostają ustawione, a znaczniki S, P, Z są ustawione zgodnie z wynikiem operacji (dla 0,0, dla 1,0 i dla 1,1). Wynik tej instrukcji przesyłany jest do pierwszego operandu. Tabela pokazuje sposób działania instrukcji AND:
| A | B | Wynik |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |
Instrukcja TEST
Instrukcja działa tak samo jak AND, tylko że nie zmienia wartości argumentów, a ustawia odpowiednio znaczniki. Zobacz AND
Instrukcja OR
Instrukcja wykonuje sumę logiczną. Parametrami jej mogą być rejestry, zmienne lub wartości liczbowe. Sumie podlegają odpowiadające sobie bity obu argumentów. Po wykonaniu tej instrukcji znaczniki C i O zostają ustawione, a znaczniki S, P, Z są ustawione zgodnie z wynikiem operacji (dla 0,0, dla 1,0 i dla 1,1). Wynik tej instrukcji przesyłany jest do pierwszego operandu. Tabela pokazuje sposób działania instrukcji OR:
| A | B | Wynik |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 1 |
Instrukcja XOR
Instrukcja wykonuje różnicę
symetryczną. Parametrami jej mogą być rejestry, zmienne lub
wartości liczbowe. Różnicy podlegają odpowiadające sobie
bity obu argumentów. Po wykonaniu tej instrukcji znaczniki C i O
zostają ustawione, a znaczniki S, P, Z są ustawione zgodnie z
wynikiem operacji (dla 0,0, dla 1,0 i dla 1,1). Wynik tej
instrukcji przesyłany jest do pierwszego operandu. Tabela
pokazuje sposób działania instrukcji XOR:
| A | B | Wynik |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 0 |
