Sterowanie pracą programu

Podobne dokumenty
Programowanie komputera

Załącznik do ćwiczenia w środowisku MASM32 wersji 10 Sterowanie przebiegiem wykonania programu

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

Architektura Systemów Komputerowych, Wydział Informatyki, ZUT

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

Architektura komputerów. Asembler procesorów rodziny x86

CPU ROM, RAM. Rejestry procesora. We/Wy. Cezary Bolek Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Ćwiczenie 3. Konwersja liczb binarnych

Sprzęt i architektura komputerów

Jerzy Nawrocki, Wprowadzenie do informatyki

Architektura systemów komputerowych Laboratorium 8 Symulator SMS32 Instrukcje skoku i pętle

Sprzęt i architektura komputerów

5. Mikroprocesory 8086 i 8088

end start ; ustawienie punktu startu programu i koniec instrukcji w assemblerze.

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Lista instrukcji mikroprocesora Programowanie w assemblerze

Lista instrukcji procesora 8051 część 2 Skoki i wywołania podprogramów, operacje na stosie, operacje bitowe

Informacje wstępne. Historia Maszyna Turinga

Architektura Systemów Komputerowych

Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania.

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

Struktura i działanie jednostki centralnej

Architektura systemów komputerowych Laboratorium 13 Symulator SMS32 Operacje na bitach

1. Operacje logiczne A B A OR B

Wprowadzenie do architektury komputerów systemy liczbowe, operacje arytmetyczne i logiczne

Adam Kotynia, Łukasz Kowalczyk

Architektura komputerów

Programowanie w asemblerze Architektura procesora

Architektura komputerów

1 Podstawy c++ w pigułce.

Zuzanna Hartleb i Artur Angiel

Przykładowe pytania DSP 1

INSTRUKCJE Instrukcje przeniesienia: Instrukcje konwersji: Arytmetyczne instrukcje:

Pzetestuj działanie pętli while i do...while na poniższym przykładzie:

Programowanie niskopoziomowe

organizacja procesora 8086

PODSTAWOWE ELEMENTY ASEMBLERA TRYBY ADRESOWANIA. OPERATORY ASEMBLERA

Kod hex Instrukcja Opis 37 AAA Koryguj AL po dodawaniu BCD

Architektura systemów komputerowych Laboratorium 7 Symulator SMS32 Stos, Tablice, Procedury

J. Duntemann Zrozumieć Assembler Leo J. Scanlon Assembler 8086/8088/80286 S. Kruk Programowanie w Języku Assembler

Architektura typu Single-Cycle

Celem ćwiczenia jest zapoznanie z obsługą klawiatury sekwencyjnej i matrycowej w systemie DSM-51.

PROGRAMY REZYDENTNE Terminate and State Resident, TSR

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

Technika mikroprocesorowa I Wykład 2

Ćwiczenie 2. Siedmiosegmentowy wyświetlacz LED

lekcja 8a Gry komputerowe MasterMind

Programowanie Niskopoziomowe

Lista rozkazów mikrokontrolera 8051

1. Pobrać plik masm.zip (Macro Assembler 6.15 & Segmented Executable Linker 5.60) (

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

Podstawy programowania w języku C i C++

START: ; start programu od adresu 0100H ; zerowanie komórek od 01H do 07FH ( 1 dec dec)

Programowanie mikrokontrolera 8051

Lista Rozkazów: Język komputera

Mikrokontroler ATmega32. Język symboliczny

Inicjacja tablicy jednowymiarowej

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Architektura komputerów

Metody Realizacji Języków Programowania

while(wyrażenie) instrukcja

Podstawy Informatyki

Organizacja typowego mikroprocesora

Technika mikroprocesorowa I Studia niestacjonarne rok II Wykład 2

Architektura komputerów. Komputer Procesor Mikroprocesor koncepcja Johna von Neumanna

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Liczniki, rejestry lab. 09 Mikrokontrolery 8051 cz. 1

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

Procesor Intel 8086 model programisty. Arkadiusz Chrobot

Kod znak-moduł. Wartość liczby wynosi. Reprezentacja liczb w kodzie ZM w 8-bitowym formacie:

for (i=0; i<10; i=i+1) instrukcja; instrukcja zostanie wykonana 10 razy for (inicjalizacja; test; aktualizacja) instrukcja;

Pracownia Komputerowa wykład IV

Wstęp do informatyki- wykład 2

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Notatka Aplikacyjna NA 03006PL Maj 2016

. III atyka, sem, Inform Symulator puterów Escape rchitektura kom A

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

1 Podstawy c++ w pigułce.

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

A Machine Architecture that is Really Intuitive and Easy. Dane: notacja dwójkowa, zapis w kodzie dopełnieniowym

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 5 Liczby w komputerze

LibreOffice Calc VBA

ARCHITEKRURA KOMPUTERÓW Kodowanie liczb ze znakiem

UTK Można stwierdzić, że wszystkie działania i operacje zachodzące w systemie są sterowane bądź inicjowane przez mikroprocesor.

Podstawy Programowania C++

Lista rozkazów mikrokontrolera 8051 część pierwsza: instrukcje przesyłania danych, arytmetyczne i logiczne

Programowanie komputerowe. Zajęcia 1

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

Podstawy Programowania Podstawowa składnia języka C++

Zapis liczb binarnych ze znakiem

Architektura komputerów

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

12. Wprowadzenie Sygnały techniki cyfrowej Systemy liczbowe. Matematyka: Elektronika:

Wstęp do informatyki. Maszyna RAM. Schemat logiczny komputera. Maszyna RAM. RAM: szczegóły. Realizacja algorytmu przez komputer

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

ARYTMETYKA BINARNA. Dziesiątkowy system pozycyjny nie jest jedynym sposobem kodowania liczb z jakim mamy na co dzień do czynienia.

Warszawa dnia 2 stycznia 2011 r. Zbiór zadań z programowania w języku C do samodzielnego wykonania

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Transkrypt:

Sterowanie pracą programu Umożliwia podejmowanie decyzji w oparciu o określone warunki. Skoki bezwarunkowe Podstawową instrukcją umożliwiającą przeniesienie sterowania do innego punktu programu oznaczonego etykietą jest JMP o następującej składni: JMP etykieta Ażeby zadeklarować etykietę w programie podajemy jej nazwę, a po niej dwukropek ":". Oto przykłady prawidłowych nazw etykiet: label1: label2: a: Etykieta może być zadeklarowana w osobnej linii lub przed dowolną instrukcją, np.: x1: mov AX, 1 x2: mov AX, 2 Przykłady wykorzystania instrukcji JMP: mov ax, 5 mov bx, 2 jmp calc back: jmp stop calc: add jmp ax, bx back stop: Instrukcja JMP pozwala przenieść sterowanie do przodu lub do tyłu, w dowolne miejsce wewnątrz segmentu. Prześledzić wykonanie powyższego programu, sprawdzać sposób kodowania instrukcji skoku oraz zachowanie licznika rozkazów. 1

Skoki warunkowe bliskie Pozwalają przenieść sterowanie przy spełnieniu określonych warunków. Podzielone są na trzy grupy: pierwsza testuje pojedyncze znaczniki, druga testuje liczby ze znakiem, a trzecia liczby bez znaku. Instrukcje skoku warunkowego testujące pojedyncze znaczniki Instrukcja Opis Warunek Instrukcja przeciwna JZ, JE Jump if Zero (Equal). ZF = 1 JNZ, JNE JC, JB, JNAE Jump if Carry (Below, Not Above Equal). CF = 1 JNC, JNB, JAE JS Jump if Sign. SF = 1 JNS JO Jump if Overflow. OF = 1 JNO JPE, JP Jump if Parity Even. PF = 1 JPO JNZ, JNE Jump if Not Zero (Not Equal). ZF = 0 JZ, JE JNC, JNB, JAE Jump if Not Carry (Not Below, Above Equal). CF = 0 JC, JB, JNAE JNS Jump if Not Sign. SF = 0 JS JNO Jump if Not Overflow. OF = 0 JO JPO, JNP Jump if Parity Odd (No Parity). PF = 0 JPE, JP Można zauważyć, że niektóre instrukcje o różnych nazwach działają tak samo, są one kodowane za pomocą tych samych kodów maszynowych. Skompilować i przeanalizować następujący fragment kodu. jnc et jnb et jae et mov AX, 4 et: mov AX, 5 Instrukcje te są dwubajtowe pierwszy bajt zawiera kod rozkazu, a drugi określa zakres skoku od -128 do +127 bajtów). 2

Instrukcje skoku warunkowego dla liczb ze znakiem Instrukcja Opis Warunek Instrukcja przeciwna JE, JZ Jump if Equal (=). Jump if Zero. ZF = 1 JNE, JNZ JNE, JNZ Jump if Not Equal (<>). Jump if Not Zero. ZF = 0 JE, JZ JG, JNLE Jump if Greater (>). Jump if Not Less or Equal (not <=). ZF = 0 and SF = OF JNG, JLE JL, JNGE Jump if Less (<). Jump if Not Greater or Equal (not >=). SF <> OF JNL, JGE JGE, JNL Jump if Greater or Equal (>=). Jump if Not Less (not <). SF = OF JNGE, JL JLE, JNG Jump if Less or Equal (<=). Jump if Not Greater (not >). ZF = 1 or SF <> OF JNLE, JG Instrukcje skoku warunkowego dla liczb bez znaku Instrukcja Opis Warunek Instrukcja przeciwna JE, JZ Jump if Equal (=). Jump if Zero. ZF = 1 JNE, JNZ JNE, JNZ Jump if Not Equal (<>). Jump if Not Zero. ZF = 0 JE, JZ JA, JNBE Jump if Above (>). Jump if Not Below or Equal (not <=). CF = 0 and ZF = 0 JNA, JBE JB, JNAE, JC Jump if Below (<). Jump if Not Above or Equal (not >=). Jump if Carry. CF = 1 JNB, JAE, JNC JAE, JNB, JNC Jump if Above or Equal (>=). Jump if Not Below (not <). Jump if Not Carry. CF = 0 JNAE, JB JBE, JNA Jump if Below or Equal (<=). Jump if Not Above (not >). CF = 1 or ZF = 1 JNBE, JA Dla porównania wartości numerycznych używana jest instrukcja CMP która działa jak instrukcja SUB lecz nie zapisuje wyniku odejmowania tylko ustawia odpowiednio znaczniki. 3

Przykłady użycia instrukcji CMP i skoków warunkowych: include "emu8086.inc" mov AL, 25 ; ustaw AL na 25. mov BL, 10 ; ustaw BL na 10. cmp AL, BL ; porównaj AL - BL. je equal ; skocz jeśli AL = BL (ZF = 1). putc 'n' jmp stop equal: putc 'y' stop: ; program w tym miejscu jeśli AL <> BL, ; wyświetla 'n' i skacze do stop. ; jeśli program osiągnie to miejsce ; oznacza to, że AL = BL, więc wyświetlane jest 'y'. ; koniec programu. Sprawdź działanie tego przykładu dla różnych wartości zapisanych do rejestrów AL i BL, otwórz okno podglądu znaczników i użyj trybu pracy krokowej. Można użyć klawisza skrótu F5 do rekompilacji i przeładowania program w emulatorze Organizacja pętli Instrukcja Loop et jest przykładem instrukcji warunkowej, która zmniejsza zawartość rejestru CX o 1, sprawdza, czy zawartość tego rejestru jest różna od 0 i jeśli tak - wykonuje skok do miejsca oznaczonego etykietą et, w przeciwnym razie procesor przechodzi do następnej po loop instrukcji. mov CX, 10 //ustawienie licznika powtórzeń pętli et: ciąg instrukcji do wykonania w pętli loop et Instukcje pętli Instrukcja Operacja i warunek skoku Instrukcja przeciwna LOOP decrease CX, jump to label if CX not zero. DEC CX and JCXZ LOOPE decrease CX, jump to label if CX not zero and equal (ZF = 1). LOOPNE LOOPNE decrease CX, jump to label if CX not zero and not equal (ZF = 0). LOOPE LOOPNZ decrease CX, jump to label if CX not zero and ZF = 0. LOOPZ LOOPZ decrease CX, jump to label if CX not zero and ZF = 1. LOOPNZ JCXZ jump to label if CX is zero. OR CX, CX and JNZ 4

W przeciwieństwie do instrukcji JMP instrukcje skoków warunkowych i pętli pozwalają przenieść sterowanie o 127 bajtów do przodu i 128 bajtów do tyłu (pamiętajmy, że instrukcje w kodzie maszynowym mają długość od 1 do 6 bajtów) Możemy łatwo obejść to ograniczenie w następujący sposób: Bierzemy z tabeli przeciwny rozkaz skoku warunkowego i podajemy adres skoku do etykiety label_x. Używamy instrukcji JMP do przeskoczenia do pożądanej lokalizacji. Definiujemy etykietę label_x: zaraz za instrukcją JMP. Przykład: Etykieta label_x: musi być unikalna w całym programie. include "emu8086.inc" mov AL, 5 mov BL, 5 cmp AL, BL ; porównanie AL - BL. ; je equal ; rozkaz 2-bajtowy jne not_equal ; skok, jeśli AL <> BL (ZF = 0). jmp equal ; skok w dowolne miejsce w segmencie not_equal: add BL, AL sub AL, 10 xor AL, BL jmp skip_data db 256 dup(0) ; 256 bytes skip_data: putc 'n' jmp stop equal: putc 'y' ; jeśli AL <> BL, ; wyświetlamy 'n' i skok do etykiety stop. ; jeśli AL = BL ; wyświetlamy 'y'. stop: 5

Funkcje systemowe (BIOS, DOS) do obsługi urządzeń wejścia-wyjścia Wyświetlanie znaku na ekranie mov DL, A mov AH, 2 Czytanie znaku z klawiatury do AL. mov AH, 1 // lub mov AH, 7 gdy czytamy bez echa Czytanie napisu z klawiatury mov DX, offset bufor mov AH, 0Ah bufor DB 10,?, 10 dup ( - ) gdzie 10 oznacza wielkość bufora na napis, zaś w miejscu? będzie umieszczona liczba znaków przeczytanych. Aby wyświetlić odczytany napis używamy funkcji 9 i adresu DS:DX+2 Wyświetlenie napisu na ekranie (napis w tablicy msg musi być zakończony znakiem $) mov DX, offset msg // lub lea DX, msg mov AH, 9 int 21 h.. msg DB Witaj $ Przykład wczytania napisu i wyświetlenie go na ekranie mov dx, offset buffer mov ah, 0Ah ; wczytanie napisu do bufora xor bx, bx ; zerowanie rejestru bx mov bl, buffer[1] mov buffer[bx+2], '$' ; dodanie znaku $ na końcu napisu mov dx, offset buffer + 2 mov ah, 9 ; wyświetlenie napisu na ekranie buffer db 10,?, 10 dup('-') Oczekiwanie na wciśnięcie klawisza pobranie znaku bez echa mov AH, 0 int 16h Po wykonaniu AH = kod przeglądania BIOS AL = kod znaku ASCII 6

Sprawdzenie czy w buforze klawiatury jest znak (bez pobierania znaku) mov AH, 1 int 16h Po wykonaniu ZF = 1 jeśli klawisz nie był wciśnięty ZF = 0 jeśli klawisz nie wciśnięty AH = kod przeglądania BIOS AL = kod znaku ASCII Dalsze informacje na temat przerwań systemowych w pomocy pod tytułem Interrupts Zadania 1. Napisać program, który porównuje liczby zapisane w AX oraz BX i zeruje rejestr o mniejszej zawartości (zakładamy, że liczby są różne). 2. Napisać program, który sprawdza, czy liczba zapisana w AX jest dodatnia jeśli tak to pozostawia ją bez zmiany, a jeśli nie - to zeruje rejestr AX. 3. Napisać program, który zawartość zmiennych X i Y ustawia tak, by w zmiennej X była wartość większa (liczby są różne). 4. Zadeklarowana jest tablica o 8 elementach typu bajt. Policzyć ile elementów jest ujemnych i wynik umieścić w zmiennej licznik. 5. Zadeklarowana jest tablica o 12 elementach typu słowo 16-bitowe. Policzyć ile elementów jest zerowych i wynik umieścić w zmiennej zero. 6. Wczytać z klawiatury liczbę podaną w postaci szesnastkowej i zapisać ją w zmiennej liczba. 7. Wyświetlić na ekranie zadany obszar pamięci w postaci: wartość szesnastkowa znak ASCII wartość dziesiętna. Adres początkowy tablicy i jej wielkość podać w zmiennych adres i liczba. 8. Zadeklarować stałą K o wartości 7. Napisać program, który wpisuje tą wartość do wszystkich 8-bitowych rejestrów procesora 8086 oraz do 10-elementowej tablicy T. 9. Zadeklarować tablicę o wielkości 10 elementów i wypełnić ją w programie kolejnymi potęgami liczby 2: 1, 2, 4, 8... 10. Zadeklarować tablicę o wielkości 16 elementów i wypełnić ją w programie kolejnymi wielokrotnościami liczby 20: 20, 40, 60... 11. Zadeklarować tablicę i wypełnić ją określoną wartością stałej wzor EQU 5. 12. Zadeklarować tablicę 10-elementową i wypełnić ją kolejnymi wartościami parzystymi. 13. Zadeklarować tablicę Tab1 DB 10 dup (?) oraz Tab2 zawierającą napis As ma kota. Skopiować zawartość tablicy Tab2 do Tab1. 14. Utworzyć dwie tablice zawierające napisy HALO i ALFA. Korzystając z rozkazy XCHG zamienić napisy miejscami. 15. Wczytać do tablicy Bufor 10 znaków z klawiatury. 16. Wyświetlić na ekranie znak wprowadzony z klawiatury zadaną liczbę razy. 17. Wczytać z klawiatury swoje imię i wyświetlić na ekranie 3 razy. 18. Wyświetlić na ekranie znaki o kodach ASCII z przedziału od 32 do 255 po 16 znaków w wierszu. 19. Wczytać z klawiatury napis złożony z małych liter i wyświetlić dużymi literami (sprawdzić w tablicy kodów ASCII przesunięcie pomiędzy małymi i dużymi literami). 20. Napisać program, który wczytuje z klawiatury do rejestru DX czterocyfrową liczbę szesnastkową. 7

Wykorzystać tablicę konwersji jak w poniższym programie mov CX, 4 mov DX, 0 et: mov AH, 1 mov AH, 0 mov SI, AX mov AL, ASCII2HEX[SI] shl DX, 4 ; przesunięcie rejestru DX w lewo o 4 pozycje (bity) add DX, AX loop et ASCII2HEX DB 48 dup (0),0,1,2,3,4,5,6,7,8,9 DB 7 dup (0),1010b,1011b,1100b,1101b,1110b,1111b 21. Napisać program, który wczytuje z klawiatury dwie liczby szesnastkowe, dodaje je (odejmuje, mnoży, dzieli) i wynik wyświetla na ekranie. 22. Zapoznać się z działaniem następującego programu ;program zamienia liczbę dziesiętną 4-cyfrowa na liczbę binarną ;wczytanie z klawiatury liczby dziesiętnej (4 cyfry) mov AX,0 mov CX,4 WE: mov DX, 10 mul DX mov DX, AX mov AH, 1 sub AL, '0' mov AH, 0 add AX, DX loop WE mov BX, AX ; wyświetlenie liczby zapisanej w BX w postaci binarnej na ekranie mov DL, '=' mov AH, 2 mov CX, 16 mov AH, 2 WY: mov DL, 0 rcl BX, 1 ; rotacja zawartości BX w lewo przez CF adc DL, '0' loop WY 8