Cezary Bolek Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki Komputer jest urządzeniem, którego działanie opiera się na wykonywaniu przez procesor instrukcji pobieranych z pamięci operacyjnej (instrukcje procesora kod programu) Instrukcje procesora odnoszą się do prostych operacji na wewnętrznych rejestrach procesora oraz operacji odczytu/zapisu komórek pamięci operacyjnej i układów we/wy Interakcja między maszyną i komputerem odbywa się za pośrednictwem układów we/wy i opiera się na konwersji danych zrozumiałych dla człowieka na dane zakodowane w formie cyfrowej (i odwrotnie). ROM, RAM CPU ALU We/Wy Rejestry procesora
Język wysokiego poziomu (C, Pascal, Java, etc.) Kompilacja (kompilator) Język niskiego poziomu: asembler Przykład for (i=; i<, i++) { n=+x*2; } MOV AL,FF wait: SUB AL, JNS wait Cechy Instrukcje języka wysokiego poziomu, zmienne, operatory arytmetyczne, swobodny układ tekstu programu, etc.. Instrukcje asemblera: mnemoniki, nazwy rejestrów, adresy komórek pamięci, etykiety linii, sztywny układ tekstu programu Asemblacja (asembler) Kod maszynowy F5 58 3 Bajty zapisane w pliku lub w pamięci komputera, które odpowiadają kolejnym instrukcjom dla procesora Program w języku asemblera składa się z linii zawierających instrukcję do wykonania przez procesor. Instrukcje asemblera są bardzo prostymi operacjami, na liczbach zapisanych w rejestrach roboczych lub komórkach pamięci za pomocą ALU. Linia programu w języku asemblera składa się z pól: np. wait: MOV AL,BL ; załaduj do AL wartość z BL etykieta (pole moŝe być puste) mnemonik (instrukcja) operandy mnemonika komentarz Mnemoniki są łatwymi do zapamiętania skrótami operacji procesora. Wszystkie liczby w programie są liczbami szesnastkowymi! 2
instr_ instr_2 instr_k- instr_k END n Instrukcje programu umieszczone są w pamięci i mogą zajmować róŝną liczbę bajtów. Program (w symulatorze) uruchamiany jest zawsze od instrukcji umieszczonej pod adresem Program musi kończyć się dyrektywą END. Wszystkie instrukcje umieszczone po tej dyrektywie są ignorowane Operacje przesyłania wartości MOV X,Y ; move mov AL,3 mov DL,A5 miejsce przeznaczenia (dokąd) wartość lub miejsce źródłowe (co lub skąd) Instrukcja przesłania MOV nie wpływa na bity rejestru SR 3
Operacje arytmetyczne (ADD, SUB, MUL, DIV) ADD X,Y operand i miejsce umieszczenia wyniku 2 operand (wartość lub miejsce) add AL,BL mul DL,4 Operacje inkrementacji (zwiększenia o ) rejestru INC X ;X X+ inc BL Operacje dekrementacji (zmniejszenia o ) rejestru DEC X ;X X- dec DL Operacje logiczne (AND, OR, XOR) AND X,Y or AL,BL xor DL,4 operand i miejsce umieszczenia wyniku 2 operand (wartość lub miejsce) A B AND OR XOR A = B = AND = OR = XOR = Logical negation operation (bit negation) NOT X not AL A = NOT = 4
Operacje przesunięć bitowych w prawo (SHR) i w lewo (SHL) SHR X ;shift right SHL X ;shift left shr BL shl DL SHL A = SHL = A = SHL = SHR A = SHR = A = SHR = Operacje przesunięć rotacyjnych w prawo (ROR) i w lewo (ROL) ROR X ; rotate right ROL X ; rotate left ror BL rol DL A = ROL = ROL A = ROL = ROR A = ROR = A = ROR = 5
SR Bity rejestru SR ustawiane są zgodnie z wynikiem ostatnio wykonanej instrukcji arytmetycznej, logicznej lub przesunięć: bit Z (zero): gdy instrukcja dała wynik gdy wynik instrukcji jest róŝny od zera bit O (overflow): gdy instrukcja arytmetyczna zakończyła się błędem (w sensie arytmetyki U2) gdy instrukcja arytmetyczna powiodła się bit S (sign): gdy instrukcja dała wynik ujemny (w kodzie U2) gdy instrukcja dała wynik nieujemny bit I (interrupt) gdy procesor moŝe przyjąć przerwanie gdy procesor nie przyjmuje przerwań MOV AL,2 ; Zapisz liczbę 2 do rejestru AL BL = MOV BL,A ; Zapisz liczbę do rejestru BL BL = ADD AL,BL ; Dodaj BL do AL, wynik będzie w AL BL = Wynikiem instrukcji ADD jest liczba C h (2 d ) w rejestrze AL. Wynik jest niezerowy (Z=), poprawny (O=), nieujemny (S=) 6
MOV CL,F ; Zapisz liczbę 5 do rejestru CL CL = DL = MOV DL,F ; Zapisz liczbę 5 do rejestru DL CL = DL = MUL DL,CL ; PomnóŜ CL i DL, wynik będzie w DL CL = DL = SR = Wynikiem instrukcji MUL jest liczba 3(U2) w rejestrze DL. Wynik jest niezerowy (Z=), niepoprawny (O=), ujemny (S=) MOV AL, ; wyzeruj rejestr AL DEC AL ; zmniejsz wartość AL o SR = Wynikiem instrukcji DEC jest liczba (U2) w rejestrze AL. Wynik jest niezerowy (Z=), poprawny (O=), ujemny (S=) 7
MOV AL,FF ; zapisz (U2) do rejestru AL INC AL ; zwiększ wartość AL o SR = Wynikiem instrukcji INC jest liczba w rejestrze AL. Wynik jest zerowy (Z=), poprawny (O=), nieujemny (S=) MOV AL,8 ; Zapisz liczbę 28(U2) do rejestru AL SUB AL,2 ; Odejmij 2 od AL, wynik będzie w AL SR = Wynikiem instrukcji SUB jest liczba 26(U2) w rejestrze AL. Wynik jest niezerowy (Z=), niepoprawny (O=), nieujemny (S=) 8
Operacje logiczne na bitach rejestrów nie mają sensu arytmetycznego, dlatego bit O (overflow) nie jest zmieniany. Bity S i Z są ustawiane tak samo jak dla instrukcji arytmetycznych. MOV AL,7F ; Zapisz liczbę 27 do rejestru AL 8 = OR AL,8 ; Przeprowadź operację OR na bitach AL i liczby 8 h SR = Operacje przesunięć na bitach rejestrów nie mają sensu arytmetycznego, dlatego bit O (overflow) nie jest zmieniany. Bity S i Z są ustawiane tak samo jak dla instrukcji arytmetycznych. MOV AL,8 ; Zapisz liczbę 28(U2) do rejestru AL SHL AL ; Przesuń bity AL o jedną pozycję w lewo SR = 9
JMP next instrukcja skoku bezwarunkowego do instrukcji o etykiecie next: Instrukcja JMP nie zmienia bitów rejestru SR np. plus: ADD AL,5 JMP stop minus: SUB AL,5 stop: MOVE BL,FF np. loop: MOV AL,55 OUT minus: JMP loop nieskończona pętla Instrukcje skoków warunkowych nie zmieniają bitów rejestru SR, ale ich wykonanie zaleŝy od stanu poszczególnych bitów SR!!! Instrukcja testuje wartość odpowiedniego bitu SR i wykonuje się (wykonuje skok do podanej etykiety) jeśli warunek określony mnemonikiem instrukcji jest spełniony, w przeciwnym wypadku skok się nie wykonuje. JZ next ; skocz jeśli Z= (ostatnia instrukcja dała wynik ) JNZ next ; skocz jeśli Z= (skocz jeśli wynik jest niezerowy) JS next ; skocz jeśli S= (skocz jeśli wynik ujemny) JNS next ; skocz jeśli S= (skocz jeśli wynik nieujemny) JO next ; skocz jeśli O= (skocz jeśli wynik niepoprawny) JNO next ; skocz jeśli O= (skocz jeśli wynik poprawny) Instrukcje skoków warunkowych stosuje się najczęściej do realizacji cykli w programach
MOV AL,7F loop: DEC AL JNZ loop cykl wykona się dokładnie 27 razy (np. pętla opóźniająca) AL 7F AL AL- Z= N T MUL JO error: AL,BL error MUL JNO JMP ok: error: AL,BL ok error wykrywanie i obsługa błędów podczas operacji arytmetycznych Operacje porównań CMP X,Y ; compare cmp AL,77 cmp AL,BL operand 2 operand Instrukcja porównania CMP wykonuje odejmowanie operandów (X-Y), a następnie ustawia bity rejestru SR zgodnie z wynikiem operacji. Wynik operacji nie jest zapisywany. Instrukcja CMP słuŝy do wykrywania konkretnej wartości w rejestrze CMP wpływa tylko na bity S (znak) i Z (zero), a więc pozwala stwierdzić a) czy X<Y (bit S=) b) czy X=Y (Z=)
loop: IN 7 CMP AL,D JNZ loop cykl oczekiwania na odczyt wartości 3 z portu 7 (np. znak Enter z klawiatury) nowy IN 7 ; czytaj kod ASCII znaku z klawiatury CMP AL,3 ; sprawdź czy kod jest >= JS nowy ; znak nie jest cyfrą, czytaj nowy znak CMP AL,4 ; sprawdź czy kod jest < 9 JNS nowy ; znak nie jest cyfrą, czytaj nowy znak cyfra fragment programu wczytującego z klawiatury znaki cyfr, ignorujący inne wprowadzone znaki Dotyczy tylko programu symulatora uŝywanego w laboratorium ROM, RAM CPU sygnalizator świetlny wyświetlać cyfrowy termostat (grzejnik) ruch robota silnik krokowy winda (sterowanie napędem) klawiatura alfanumeryczna klawiatura numeryczna Out 2 3 4 5 6 7 8 numer portu In klawiatura termostat (temperatura) winda (odczyt klawiatury i połoŝenia) klawiatura alfanumeryczna (odczyt) klawiatura numeryczna (odczyt) 2
IN numer instrukcja odczytu wartości z portu o podanym numerze, wartość jest umieszczana w rejestrze AL OUT numer instrukcja wysłania wartości do portu o podanym numerze, wartość musi być wcześniej umieszczona w rejestrze AL MOV AL,55 OUT zapalenie kombinacji świateł na sygnalizatorze ulicznym (port ) IN CMP AL,B JZ end wczytanie znaku z klawiatury i jeśli był to znak Escape, to skok do zakończenia programu 3