Asembler podstawowe instrukcje deklarowanie zmiennych Ariel Grzechowski Rejestr
Asembler - podstawowe instrukcje, deklarowanie zmiennych. Ariel Grzechowski
Rejestr flag Zapisane są w nim takie ustawienia, jak np. możliwość korzystania z instrukcji wejścia-wyjścia przez nasz program. Ponadto, w rejestrze tym zapisywanych jest wiele informacji na temat ostatnio przeprowadzanej operacji arytmetycznej. Rejestr EFLAGS wygląda tak (rozkład bitów): 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 0 0 0 0 0 ID VIP VIF AC VM RF 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 NT OF DF IF TF SF ZF 0 AF 0 PF 1 CF IOPL
Rejestr flag znaczniki, których wartość zależna jest jedynie od ostatniego działania arytmetycznego ID ang. nazwa równy 1 gdy CF carry flag w wyniku dodawania/odejmowania przekroczono możliwy zakres wartości zmiennej PF parity flag liczba jedynek w najmłodszym bajcie jest parzysta AF auxiliary flag wystąpiło przeniesienie z bitu 3. na 4. lub pożyczka z 4. na 3. ZF zero flag wynik ostatniego działania wyniósł 0 SF sign flag bit znaku jest równy 1 (liczba jest ujemna) OF overflow flag bit znaku zmienił swoją wartość, ale nie doszło do przeniesienia poza zakres (tzn. CF=0) pozostałe znaczniki ze zmienną wartością NT nested task obecny proces nie wywodzi się z żadnego innego (nie wywołano go poprzez CALL; nie dotyczy JMP) RF resume flag wystąpiło przerwanie zatrzymujące wykonanie programu (może wystąpić tylko, gdy TF=1) VIP virtual interrupt pending trwa wirtualne przerwanie ID ID flag jeśli można zmienić jej wartość oznacza to, że procesor obsługuje instrukcję CPUID
Rejestr flag znaczniki, które mają wpływ na sposób działania procesora ID ang. nazwa gdy równy 1 TF trap flag procesor wchodzi w tryb pracy krokowej, dzięki czemu po każdym wykonanym poleceniu generuje przerwanie i przechodzi do odpowiednich procedur obsługi (wykorzystywane przez np. debuggery) IF interrupt flag przerwania są uwzględniane (w przeciwnym wypadku są ignorowane) DF direction flag przetwarzanie łańcuchów odbywa się w normalny sposób, ku rosnącym adresom; w przeciwnym wypadku w dół, ku malejącym IOPL inputoutput privilage level odczyt/zapis z/do wyjścia jest dozwolony; jest to 2 -bitowa flaga VM virtual 8086 mode przejście w tryb emulacji procesora 8086 VIF virtual interrupt flag przerwania są dozwolone (kopia IF w trybie wirtualnym); aby tryb wirtualny został aktywowany musi zostać włączona flaga VME w rejestrze CR 4
Asembler - podstawowe instrukcje Instrukcje dzielimy na: 1. Arytmetyczne 2. Logiczne 3. Skokowe 4. Transferowe
Asembler – instrukcje arytmetyczne add działanie: sumuje A i B; wynik przechowuje w A. A: rejestr lub adres pamięci. B: konkretna wartość, rejestr lub adres pamięci (jeśli A nie jest adresem). modyfikowane flagi: OF, CF, SF, ZF, AF i PF. Przykład: add eax, 09 h
Asembler – instrukcje arytmetyczne sub działanie: odejmuje B od A; wynik przechowuje w A. A: rejestr lub adres pamięci. B: konkretna wartość, rejestr lub adres pamięci (ale tylko jeśli A również nie jest adresem pamięci). modyfikowane flagi: OF, CF, SF, ZF, AF i PF. Przykład: sub edx, 09 h
Asembler – instrukcje arytmetyczne mul działanie: mnoży A przez odpowiedni rejestr i zapisuje wynik w odpowiednim rejestrze (zależne od rozmiaru A; patrz tabela); wszystkie działania są wykonywane na liczbach bez znaku; dla liczb ze znakiem skorzystaj z imul. A: rejestr ogólnego przeznaczenia lub adres pamięci. modyfikowane flagi: OF, SF, ZF, AF, PF i CF. modyfikowane rejestry: zależnie od rozmiaru A Przykład: mul eax rozmiar A rejestr wynik byte AL AX word AX DX: AX double word EAX EDX: EAX
Asembler – instrukcje arytmetyczne div działanie: dzieli odpowiedni rejestr przez A i przechowuje wynik w tym rejestrze (patrz niżej). Zarówno rejestr jak i A są traktowane jako liczby bez znaku. Dla liczb ze znakiem skorzystaj z idiv. A: rejestr lub adres pamięci. modyfikowane flagi: OF, CF, SF, ZF, AF i PF. modyfikowane rejestry: zależnie od rozmiaru A. Przykład: div eax rozmiar A rejestry wynik reszta byte AX AL AH word DX: AX AX DX double word EDX: EAX EDX
Asembler – instrukcje arytmetyczne POZOSTAŁE adc cmp dec idiv sumowanie A i B oraz flagi CF (przeniesienia) porównuje A i B oraz ustawia flagi zmniejsza A o 1 dzielenie dla liczb ze znakiem imul inc sbb mnożenie dla liczb ze znakiem zwiększa A o 1 odejmuje B i flage CF(przeniesienie) od A
Asembler – instrukcje logiczne and działanie: wykonuje operację AND (koniunkcja) na odpowiadających sobie bitach operandów A i B; wynik jest przechowywany w A (poprzednia wartość zostaje zamazana). A: rejestr lub adres pamięci. B: konkretna wartość, rejestr lub adres pamięci (jeśli A nie jest adresem). modyfikowane flagi: OF i CF są zerowane; SF, ZF i PF nabywają wartość zależną od wyniku. Przykład: and edx, ebx
Asembler – instrukcje logiczne not działanie: neguje (odwraca) wartości wszystkich bitów w A (1 ->0; 0 ->1). W literaturze instrukcja ta zwana jest także uzupełnieniem jedynkowym A: rejestr lub adres pamięci. Przykład: not edx
Asembler – instrukcje logiczne shl działanie: przesuwa wszystkie bity A w lewo o ilość bitów zdefiniowaną przez B A: rejestr lub adres pamięci. B: konkretna wartość lub rejestr CL (8 -bitowa część rejestru ECX). modyfikowane flagi: CF (przyjmuje wartość ostatniego bitu "wyrzuconego" poza obręb); SF, ZF i PF (zależnie od wyniku), OF (tylko, gdy B=1; przyjmuje wartość 0, gdy dwa ostatnie bity przed przesunięciem były równe; przyjmuje 1 w przeciwnym przypadku). Przykład: shl edx 02 h
Asembler – instrukcje logiczne POZOSTAŁE neg wykonuje działanie 0 -A (odwraca znak liczby) or wykonuje operacje OR na bitach A i B shr przesuwa bity A w prawo test wykonuje operacje AND ale nie zapisuje nigdzie wyniku, ustawia tylko odpowiednie flagi xor wykonuje operacje XOR na bitach A i B
Asembler – instrukcje skokowe jmp działanie: polecenie wykonuje bezwarunkowy skok do etykiety. Instrukcja ta przyjmuje tylko jeden operand. A: etykieta do której ma być wykonany skok. Przykład: jmp etykieta
Asembler – instrukcje skokowe call działanie: wykonuje wywołanie procedury (funkcji). A: etykieta lub adres procedury zawarty w rejestrze lub komórce pamięci. Przykład: Call moja_procedura
Asembler – instrukcje skokowe POZOSTAŁE Mnemonik Opis warunku Znacznik lub rejestr JZ JE skok, jeśli zero skok, jeśli równe ZF=1 JNZ JNE skok, jeśli nie zero skok, jeśli nie równe ZF=0 JA JNBE skok, jeśli większe (bez znaku) skok, jeśli nie mniejsze lub równe (bez znaku) CF=0 i ZF=0 JNA JBE skok, jeśli nie większe (bez znaku) skok, jeśli mniejsze lub równe (bez znaku) CF=1 lub ZF=1 JB JNAE JC skok, jeśli mniejsze (bez znaku) skok, jeśli nie większe lub równe (bez znaku) skok, jeśli jest przeniesienie CF=1 JNB JAE JNC skok, jeśli nie mniejsze (bez znaku) skok, jeśli większe lub równe (bez znaku) skok, jeśli nie ma przeniesienia CF=0 JG JNLE skok, jeśli większe (ze znakiem) skok, jeśli nie mniejsze lub równe (ze znakiem) ZF=0 i SF=OF
Asembler – instrukcje skokowe POZOSTAŁE Mnemonik Opis warunku Znacznik lub rejestr JNG JLE skok, jeśli nie większe (ze znakiem) skok, jeśli mniejsze lub równe (ze znakiem) ZF=1 lub SF<>OF JL JNGE skok, jeśli mniejsze (ze znakiem) skok, jeśli nie większe lub równe (ze znakiem) SF<>OF JNL JGE skok, jeśli nie mniejsze (ze znakiem) skok, jeśli większe lub równe (ze znakiem) SF=OF JCXZ skok, jeśli rejestr CX=0 JECXZ skok, jeśli rejestr ECX=0 JP, JPE skok, jeśli parzystość PF=1 JNP, JPO skok, jeśli nieparzystość PF=0 JO skok, jeśli przepełnienie OF=1 JNO skok, jeśli nie ma przepełnienia OF=0 JS skok, jeśli znak (ujemny) SF=1 JNS skok, jeśli nie ma znaku (dodatni) SF=0
Asembler – instrukcje transferowe mov działanie: kopiuje B do A. Oba parametry muszą być tego samego rozmiaru. Operand docelowy i źródłowy nie mogą być jednocześnie adresami w pamięci. A: rejestr ogólnego przeznaczenia, rejestr segmentowy (poza CS) lub adres w pamięci. B: konkretna wartość, rejestr ogólnego przeznaczenia, rejestr segmentowy lub adres w pamięci. Przykład: mov edx, 09055509 h
Asembler – instrukcje transferowe push działanie: umieszcza A na szczycie stosu. A: word lub double word. modyfikowane rejestry: ESP (zwiększany o rozmiar A) Przykład: push edx
Asembler – instrukcje transferowe xchg działanie: wymienia zawartość operandów między sobą. Przykład: xchg AL, CL
Asembler – instrukcje transferowe POZOSTAŁE clc cld cli cmc Ustawia flagę CF na 0 Ustawia flagę DF na 0 Ustawia flagę IF na 0 Neguje zawartość flagi CF movzx out Kopiuje B do A wraz z rozszerzeniem o zera wysyła dane A do portu B
Asembler – instrukcje transferowe POZOSTAŁE pop zdejmuje ze stosu wartość i kopiuje do A popa, popad zdejmuje ze stosu wszystkie wartości i kopiuje je rejestrów ogólnego przeznaczenia pusha odkłada wszystkie rejestry na stos stc Ustawia flagę CF na 1 std Ustawia flagę DF na 1 sti Ustawia flagę IF na 1
Asembler – deklarowanie zmiennych NASM Aby utworzyć nową zmienną należy użyć schematu: nazwa typ wartość W polu nazwa wpisujemy nazwę dla naszej zmiennej (pole to jest opcjonalne); w polu typ wpisujemy typ zmiennej (patrz: tabela), zaś w polu wartość wpisujemy startową wartość dla naszej zmiennej. ID PRZYKŁAD: liczba db 10 nazwa ang. nazwa polska rozmiar b byte bajt 1 bajt w word słowo 2 bajty d double word podwójne słowo 4 bajty f threefold word potrójne słowo/sześć bajtów 6 bajtów q quad word poczwórne słowo 8 bajtów t ten bytes dziesięć bajtów 10 bajtów
Asembler – deklarowanie zmiennych GNU As Aby utworzyć nową zmienną należy użyć schematu: nazwa: . typ wartość PRZYKŁAD: liczba. string "10183"
- Slides: 25