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

Podobne dokumenty
Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

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

Architektura komputerów. Asembler procesorów rodziny x86

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

Pamięć operacyjna. segment stosu. PUSH src - instrukcja składowania na stosie działa następująco

Ćwiczenie 3. Konwersja liczb binarnych

Sprzęt i architektura komputerów

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

Sprzęt i architektura komputerów

Sterowanie pracą programu

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

PODSTAWOWE ELEMENTY ASEMBLERA TRYBY ADRESOWANIA. OPERATORY ASEMBLERA

Programowanie Niskopoziomowe

organizacja procesora 8086

Lista instrukcji mikroprocesora Programowanie w assemblerze

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

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

Architektura komputerów

Programowanie komputera

PROGRAMY REZYDENTNE Terminate and State Resident, TSR

Ćwiczenie nr 4. Zasady kodowania podprogramów

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

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.

Programowanie Niskopoziomowe

Praktycznie całe zamieszanie dotyczące konwencji wywoływania funkcji kręci się w okół wskaźnika stosu.

Ćwiczenie nr 6. Programowanie mieszane

Zuzanna Hartleb i Artur Angiel

Programowanie Niskopoziomowe

Ćwiczenie 2. Siedmiosegmentowy wyświetlacz LED

Architektura Systemów Komputerowych, Wydział Informatyki, ZUT

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

Procesor Intel 8086 model programisty. Arkadiusz Chrobot

1. Operacje logiczne A B A OR B

INSTRUKCJE Instrukcje przeniesienia: Instrukcje konwersji: Arytmetyczne instrukcje:

MOŻLIWOŚCI PROGRAMOWE MIKROPROCESORÓW

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

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

PROGRAMOWANIE NISKOPOZIOMOWE. Systemy liczbowe. Pamięć PN.01. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Procesor Intel 8086 model programisty. Arkadiusz Chrobot

petla:... ; etykieta określa adres w pamięci kodu (docelowe miejsce skoku) DJNZ R7, petla

Architektura komputerów

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

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

Struktura i działanie jednostki centralnej

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

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

Technika mikroprocesorowa I Studia niestacjonarne rok II Wykład 2

Organizacja typowego mikroprocesora

Pracownia elektryczno-elektroniczna klasa IV

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

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

Architektura Systemów Komputerowych

1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci:

Opis procedur asemblera AVR

STRUKTURA I ORGANIZACJA STOSU (FILO- First In Last Out) Rejestry stosu: SS i SP (Stack Segment i Stack Pointer)

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Mikrokontroler ATmega32. Język symboliczny

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Przykładowe pytania DSP 1

Technika mikroprocesorowa I Wykład 2

Programowanie niskopoziomowe

Adam Kotynia, Łukasz Kowalczyk

PROGRAMOWANIE W C++ ZADANIA

2.1. W architekturze MIPS, na liście instrukcji widzimy dwie instrukcje dotyczące funkcji: .text main: la $a0, string1 # drukuj pierwszy łańcuch

Rekurencja (rekursja)

Przerwania w architekturze mikrokontrolera X51

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

wagi cyfry pozycje

L6.1 Systemy liczenia stosowane w informatyce

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

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

Metody Realizacji Języków Programowania

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

1 Powtórzenie wiadomości

Programowanie w C/C++ Instrukcje - konstrukcje powtórka. LABORKA Piotr Ciskowski

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Architektura komputerów

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

Procesory rodziny x86. Dariusz Chaberski

1. Asembler i wstawki asemblerowe w C

Techniki multimedialne

architektura komputerów w 1 1

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Programowanie na poziomie sprzętu. Tryb chroniony cz. 1

Pracownia Komputerowa wykład IV

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

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

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

Warsztaty dla nauczycieli

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

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

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

do instrukcja while (wyrażenie);

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

Programowanie w języku Python. Grażyna Koba

PROGRAMOWANIE NISKOPOZIOMOWE

Podstawy informatyki. Informatyka Stosowana Zajęcia nr 5. autor: Grzegorz Smyk

IX. Wskaźniki.(3 godz.)

Transkrypt:

Operacje na stosie Stos jest obszarem pamięci o dostępie LIFO (Last Input First Output). Adresowany jest niejawnie przez rejestr segmentowy SS oraz wskaźnik wierzchołka stosu SP. Używany jest do przechowywania stanu procesora podczas wykonywania procedury i obsługi przerwań oraz do przekazywania parametrów do procedury. PUSH src - instrukcja składowania na stosie działa następująco odejmuje 2 od zawartości rejestru SP zapisuje zawartość src na stosie pod adresem SS:SP. POP dst - instrukcja pobierania ze stosu działa następująco pobiera ze stosu wartość spod adresu SS:SP i zapisuje do dst. dodaje 2 do rejestru SP. src oraz dst mogą określać rejestr 16-bitowy lub komórkę pamięci (na stosie umieszczane są wartości 16-bitowe). Dla programów typu program.com rejestr segmentowy stosu SS ustawiany jest na taką samą wartość jak rejestr segmentu kodu CS zaś zawartość SP przyjmuje wartość 0FFFEh. Pod adresem SS: 0FFFEh przechowywany jest adres powrotu z programu po instrukcji ret. Można obserwować zawartość stosu oraz zachowanie wskaźnika stosu naciskając przycisk [Stack] w oknie emulatora. Pozycja wierzchołka stosu wskazywana jest przez symbol <. Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów MOV AX, 1234h PUSH AX ; zapisanie zawartości AX na stosie MOV AX, 5678h ; zmiana zawartości AX POP AX ; odtworzenie oryginalnej zawartości AX MOV AX, 1234h ; zapisanie wartości 1234h do AX. MOV BX, 5678h ; zapisanie wartości 5678h do BX PUSH AX ; zapisanie zawartości AX na stosie PUSH BX ; zapisanie zawartości BX na stosie POP AX ; zapisanie do AX oryginalnej zawartości BX POP BX ; zapisanie do BX oryginalnej zawartości AX zamiana miejscami Zadanie Zapisać na stosie liczby od 1 do 12, a następnie pobrać je ze stosu i wpisać do tablicy TAB. Uwaga: Wykorzystanie rejestru BP do adresowania stosu będzie omówione przy omawianiu procedur. 1

Procedury Procedura jest fragmentem kodu wywoływanego z program w celu realizacji określonego zadania. Zastosowanie procedur sprawia, że program uzyskuje określoną strukturę i jest łatwiejszy do zrozumienia. Wykorzystanie procedur umożliwia powtórne użycie kodu (wielokrotne wykorzystanie procedur w różnych programach). Użycie procedur zmniejsza wielkość pamięci zajmowanej przez program. Po zakończeniu procedury program z reguły wraca do miejsca wywołania (następnej instrukcji). Składnia procedury jest następująca: name PROC ; kod procedury... name P name nazwa procedury. Instrukcja kończy wykonanie procedury i nakazuje powrót do program wywołującego. PROC oraz P są dyrektywami kompilatora i nie generują żadnego kodu. Kompilator po prostu zapamiętuje adres procedury. Instrukcja CALL służy do wywołania procedury. Oto przykład: CALL name MOV AX, 1 CALL m1 MOV AX, 2 CALL m1 m1 PROC ADD AX, 5 m1 P ; powrót do system operacyjnego. ; powrót do program wywołującego. Istnieją różne sposoby przekazywania parametrów i wyniku działania pomiędzy programem wywołującym a funkcję. Najprostszym jest przekazywanie przez rejestry. 2

Przykład: W następującym przykładzie procedura otrzymuje dwa parametry przez rejestry AL oraz BL, mnoży je i wynik zwraca przez rejestr AX: MOV AH, 0 MOV AL, 1 MOV BL, 2 CALL m2 CALL m2 CALL m2 CALL m2 ; powrót do system operacyjnego. m2 PROC MUL BL ; AX = AL * BL. ; powrót do program wywołującego. m2 P W powyższym przykładzie obliczona jest wartość 2 do potęgi 4. Zadania. 1. Napisać funkcję, która mały znak ASCII zamienia na duży i wykorzystać ją w programie. Inne znaki pozostawić bez zmiany. 2. Napisać funkcję, która małe znaki łańcucha (zakończonego 0) zamienia na duże. Użyć ją w programie, który wczytuje łańcuch z klawiatury, zamienia na duże litery i wyświetla na ekranie. Dokonywać zamiany Enter na 0 i odwrotnie. 3

Przykład: W następnym przykładzie używana jest procedura do wyświetlenia komunikatu Hello World: LEA SI, komunikat ; pobranie adresu zmiennej komunikat do SI. CALL drukuj ; powrót do systemu operacyjnego. ; ========================================================== ; procedura wyświetla napis zakończony zerem (znacznik końca) ; adres łańcucha znaków przekazywany jest przez rejestr SI: drukuj PROC next_char: CMP b.[si], 0 ; sprawdzenie czy osiągnięto znacznik końca (0) JE stop ; jeśli tak to koniec procedury MOV AL, [SI] ; pobranie następnego kodu ASCII. MOV AH, 0Eh ; funkcja systemowa. INT 10h ; wyświetla znak zapisany w AL. INC SI JMP next_char ; przejście do następnego znaku. stop: drukuj ; powrót do program wywołującego. P ; ========================================================== komunikat DB 'Hello World!', 0 ; tablica znaków zakończona znacznikiem końca (0). Prefiks "b." przed [SI] oznacza, że porównujemy bajty; porównując wartości 16-bitowe używamy prefiksu "w.". Jeśli porównywana jest zawartość rejestru prefiksy te nie są potrzebne, gdyż kompilator zna rozmiary rejestrów. 4

Przykład definicji i użycia procedury: outhex PROC ;specyfikacja funkcji ; wejście: BH zawiera bajt ; wyjście: pisz szesnastkową wartość bajtu ;zapamiętanie stanu procesora (rejestrów wykorzystywanych przez funkcję) push AX push BX push CX push DX ;operacje realizowane przez funkcję mov DL, BH mov CL, 4 shr DL, CL ; analiza 4 bitów mniej znaczących mov CX, 2 ; pętla 2 razy AGAIN: cmp DL, 9 ja BIG add DL, 30h jmp PRINT BIG: add DL, 37h PRINT: mov AH, 2 int 21h ; wyświetlenie znaku mov DL, BH and DL, 0Fh ; wyzeruj starsze 4 bity loop AGAIN ;odtworzenie stanu procesora (w odwrotnej kolejności!!!) pop DX pop CX pop BX pop AX ;powrót do program wywołującego ret outhex P Użycie procedury mov BH, zmienna ; podaj argument dla OUTHEX call outhex 5

Przykład procedury komunikującej się z programem głównym za pośrednictwem stosu: N EQU 4 org 100h ; sumowanie kilku liczb przekazywanych przez stos push a push b push c push d push N ; liczba sumowanych elementów call suma add SP,10 ; przesunięcie wskaźnika stosu o obszar zajęty przez parametry ret suma PROC mov BP, SP ; ustawienie rejestru bazowego dla dostępu do parametrów push CX mov CX, [BP+2] mov AX, 0 mov SI, 4 ets: add AX, [BP+SI] add SI, 2 loop ets pop CX ret ; wynik zwracany przez AX suma P a dw 3 b dw 2 c dw 7 d dw 4 end Narysować obraz stosu w momencie wywołania procedury i prześledzić operacje na stosie podczas pracy programu. 6

Wykorzystanie stosu do komunikacji z procedurą. ;Program procsuma.asm ;dodaj_proc.asm ;----------------------------------------------------------- org 100h mov AH, 09H ;wyświetlenie komunikatu lea DX, komunikat int 21H ;dos interrupt ; wczytywanie wartości z klawiatury mov AH, 0AH ;buforowane wejście z klawiatury lea DX, listapar int 21H ; pobierz dwie liczby całkowite mov AL, poleoper ;pobierz 1 znak z poleoper mov AH, 00H push AX ; 1 argument na stos mov BL, poleoper +1 ; pobierz 2 znak z poleoper mov BH, 00H push BX ; 2 argument na stos call oblicz ;odłożenie adresu powrotu na stosie i przejście do procedury ;miejsce powrotu po wykonaniu procedury ;zapisanie sumy do zmiennej wynik mov wynik+8, AH mov wynik+9, AL ;wyświetlenie wyniku mov AH, 09H ;wyświetlenie napisu lea DX, wynik int 21H ret ;----------------------------------------------------------- oblicz PROC push BP ;wykorzystany będzie rejestr BP mov BP, SP ;BP wskazuje na wierzchołek stosu mov AX, [BP+4] ;pobranie pierwszego operandu add AX, [BP+6] ;dodanie drugiego argumentu do AX aaa ;korekcja dziesiętna dla kodów ASCII or AX, 3030H ;zamiana na kod ASCII pop BP ;odtworzenie BP ret 4 ;pobranie IP z dodaniem 4 do SP tak by wskazywał początkową lokalizację oblicz P listapar LABEL BYTE maxnapis DB 5 liczbazn DB? 7

poleoper DB 5 DUP(?) komunikat DB 0DH, 0AH, Podaj dwie liczby jednocyfrowe: $ wynik DB 0DH, 0AH, Suma = $ ;----------------------------------------------------------- Wykorzystanie stosu w powyższym programie Zadania 1. Napisz funkcję obliczającą wartość f(x)=0 dla x<0 oraz f(x)=x 2 dla x 0. Wykorzystaj ją w programie. 2. Napisz funkcję, która zwraca wartość największej z trzech przekazywanych jej liczb całkowitych. Wykorzystaj tę funkcję w programie głównym. 3. Napisz funkcję, która zwraca wartość największą (najmniejszą, sumę elementów) z tablicy liczb całkowitych. Wykorzystaj tę funkcję w programie głównym. 4. Napisz funkcję obliczającą wartość f(x)= -1 dla x<0, f(x)= 0 dla x=0 oraz f(x)=+1 dla x>0. Wykorzystaj tę funkcję w programie. 5. Napisać funkcję, która otrzymuje jako parametry łańcuch S oraz liczbę powtórzeń N, a następnie wyświetla łańcuch S N-razy przy czym za każdym razem poprzedza go liczbą spacji o 1 większą (aż do N-1 spacji). 6. Napisać funkcję obliczającą k-ty wyraz ciągu Fibonacciego. Użyć ją w programie do wyznaczenia N wyrazów ciągu. 7. Napisać funkcję potega(), która podnosi liczbę typu int do dowolnej potęgi całkowitej. 0 do dowolnej potęgi wynosi 0. Dowolna liczba (oprócz 0) do potęgi 0 równa się 1. 8. Napisać procedurę binhex wyświetlającą zawartość AX w postaci szesnastkowej na ekranie. Użyć ją w programie do wyświetlania zawartości AX, BX, CX, DX. 9. Napisać procedurę hexbin wprowadzającą 4 cyfry szesnastkowe z klawiatury i zamieniającą je na liczbę binarną w AX. Użyć ją w programie do wczytania 5 liczb z klawiatury do tablicy TAB. 8