Akademia Górniczo- Hutmicza w Krakowie Katedra Elektroniki WIET

Podobne dokumenty
Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

Techniki mikroprocesorowe i systemy wbudowane

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

Dyrektywy asemblera. Składnia: etykieta:.dyrektywa argument. rezerwuje zasoby w SRAM początek segmentu kodu

Mikrokontroler ATmega32. Tryby adresowania Rejestry funkcyjne

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

Mikroprocesory i mikrosterowniki

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

Organizacja typowego mikroprocesora

Elementy składoweµc - przypomnienie

Architektura komputerów. Asembler procesorów rodziny x86

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

Podstawy techniki mikroprocesorowej. Dr inż. Grzegorz Kosobudzki p.311a A-5. Tel

architektura komputerów w 1 1

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

Programowanie Niskopoziomowe

Programowanie Niskopoziomowe

Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

Podstawy Techniki Mikroprocesorowej

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

Wstępdo assemblera MA51

Schemat blokowy architektury AVR

MOŻLIWOŚCI PROGRAMOWE MIKROPROCESORÓW

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

Mikroprocesor Operacje wejścia / wyjścia

Architektura komputerów

Ćwiczenie nr 6. Programowanie mieszane

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

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

AGH Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

JAK DZIAŁAJĄ FUNKCJE PODZIAŁ PAMIĘCI

PROGRAMOWALNE SYSTEMY MECHATRONIKI

Mikrokontroler ATmega32. Język symboliczny

Instytut Teleinformatyki

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

Podstawy Techniki Mikroprocesorowej

Struktura i działanie jednostki centralnej

Wstęp do informatyki. Architektura co to jest? Architektura Model komputera. Od układów logicznych do CPU. Automat skończony. Maszyny Turinga (1936)

Mikroprocesory i Mikrosterowniki

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

Programowanie mikrokontrolerów. 5 grudnia 2007

Architektura typu Single-Cycle

Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

Język programowania: Lista instrukcji (IL Instruction List)

Programowanie niskopoziomowe

Komputery klasy PC. Dariusz Chaberski

Układ sterowania, magistrale i organizacja pamięci. Dariusz Chaberski

Architektura typu multi cycle

Programowanie mikrokontrolerów. 8 listopada 2007

Mikroprocesory i mikrosterowniki

Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

Opis procedur asemblera AVR

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

Kompilator języka C na procesor 8051 RC51 implementacja

Wydział Elektryczny. Katedra Automatyki i Elektroniki. Instrukcja do ćwiczeń laboratoryjnych z przedmiotu: SYNTEZA UKŁADÓW CYFROWYCH ES2D100005

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Mikroprocesory i Mikrosterowniki

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

Architektura systemów komputerowych

Struktura programu w asemblerze mikrokontrolera 8051

Programowanie Mikrokontrolerów

Metody obsługi zdarzeń

Technika mikroprocesorowa I Studia niestacjonarne rok II Wykład 2

Logiczny model komputera i działanie procesora. Część 1.

Politechnika Śląska w Gliwicach

Programowanie mikrokontrolera 8051

Tworzenie nowego projektu w asemblerze dla mikroprocesora z rodziny 8051

Procedury. int mult (int mcand, int mlier){ int product = 0; while (mlier > 0) { product = product + mcand; mlier = mlier -1; } return product; }

Instytut Teleinformatyki

Przerwania w architekturze mikrokontrolera X51

Wstęp. do języka C na procesor (kompilator RC51)

Instytut Teleinformatyki

Liczniki, rejestry lab. 08 Mikrokontrolery WSTĘP

Wstęp do assemblera MA51

Sterowanie multipleksowe 4-cyfrowego wyświetlacza siedmiosegmentowego w oparciu o system przerwao mikrokontrolera ATmega16 w języku Asembler

Mikroprocesory i technika mikroprocesorowa

Organizacja pamięci VRAM monitora znakowego. 1. Tryb pracy automatycznej

1. Dyrektywy asemblerowe

Układ wykonawczy, instrukcje i adresowanie. Dariusz Chaberski

Rozszerzalne kody operacji (przykład)

Programowanie w C++ 1 Opis procesora Sextium II. Opis procesora Sextium. materiały dydaktyczne udostępnione przez Tomasza Wierzbickiego

Technika Mikroprocesorowa Laboratorium 5 Obsługa klawiatury

organizacja procesora 8086

Mikroprocesory i Mikrosterowniki

Komunikacja między sterownikami przez protokół ADS

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

Przerwania, polling, timery - wykład 9

MIKROPROCESORY I MIKROKONTROLERY INSTRUKCJE / KOMENDY / ROZKAZY: PRZEGLĄD I KILKA PRZYKŁADÓW DLA PRZYPOMNIENIA, GŁÓWNE REJESTRY ROBOCZE CPU:

Programowanie hybrydowe C (C++) - assembler. MS Visual Studio Inline Assembler

PAMIĘCI. Część 1. Przygotował: Ryszard Kijanka

Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

Szkolenia specjalistyczne

Programowanie mikrokontrolerów - laboratorium

dr inż. Jarosław Forenc

imei Instytut Metrologii, Elektroniki i Informatyki

Laboratorium 1: Wprowadzenie do środowiska programowego. oraz podstawowe operacje na rejestrach i komórkach pamięci

Procesory rodziny x86. Dariusz Chaberski

Instytut Teleinformatyki

Mikrokontrolery AVR ATmega

Technika mikroprocesorowa I Wykład 2

Transkrypt:

Akademia Górniczo- Hutmicza w Krakowie Katedra Elektroniki WIET Technika mikroprocesorowa Instrukcja 3 Stos i podprogramy Autor: Paweł Russek Tłumaczenie: Marcin Pietroń http://www.fpga.agh.edu.pl/tm ver. 04/04/15 1/8

1. Cel laboratorium Głównym celem laboratorium jest zapoznanie studentów z instrukcjami procesora AVR, które umożliwiają kontrolowanie przebiegu programów oraz pozwalają na podział programu na moduły w postaci osobnych podprogramów. Praca podprogramów możliwa jest dzięki strukturze zwanej stosem. 2. Wiadomości wstępne Znajomość zagadnień laboratoriów z techniki mikroprocesorowej nr. 1 i 2. 3. Stos, wskaźnik stosu oraz instrukcje stosowe Stos to część pamięci RAM procesora służąca przechowywania danych tymczasowych. Procesor wykorzystuje przestrzeń danych w postaci stosu ponieważ dysponuje ograniczoną liczbą rejestrów wewnętrznych. Procesor AVR posiada specjalny rejestr, który służy do przechowywania adresu stosu (SP stack pointer register). Szerokość rejestru wskaźnika stosu powinna być odpowiednio duża, aby możliwe było zaadresowanie całej przestrzeni pamięci RAM. Procesor AVR dysponuje dwoma rejestrami 8-bitowymi SPL i SPH. Rejestr SP jest realizowany jako połączenie dwóch wyżej wymienionych rejestrów 8-bitowych. 8-bit 8-bit SP: SPH SPL Wskaźnik stosu (zawartość rejestru SP) wskazuje na szczyt stosu. Program procesora może zapisać/wstawić dane na stos (poprzez instrukcję push) oraz odczytać/ściągnąć dane ze stosu (poprzez instrukcję pop). Dane mogą być wstawiane i ściągane jedynie ze szczytu stosu. Stos to struktura typu Last-In-First_Out (LIFO). Według definicji struktura LIFO to lista, do której dane mogą dodawane lub wyciągane jedynie z jej jednego końca (rysunek poniżej). Biały element został zapisany na stosie jako pierwszy, więc będzie odczytywany/ściągany ze stosu jako ostatni. Porządek elementów na wyjściu (po odczytaniu elementów ze stosu) jest odwróceniem wejścia (kolejności zapisu elementów na stos). W większości procesorów (np. rodzina procesorów x86) a także w procesorze AVR zawrtość rejestru wskaźnika stosu jest zmniejszana podczas zapisywania danych na stos. 2/8

3.1. Instrukcja zapisywania/wkładania danych na stos (push) Instrukcja zapisuje zawartość rejestru Rn na stosie (pod adresem wskazywanym przez rejestr SP): (SP) Rn. Wartość w rejestrze jest zmniejszana o wartość jeden po wykonaniu instrukcji. push Rn ;0 n 31 (SP) Rn, SP SP - 1 3.2. Instrukcja ściągania/czytania danych ze stosu (pop) Instrukcja zapisuje rejestr Rn wartością ze stosu: Rn (SP). Wartość w rejestrze jest zwiększana o wartość jeden przed wykonaniem instrukcji. Przykład. pop Rn ;0 n 31 SP SP + 1, Rn (SP), ; Step by step analysis of stack operations r16 r17 sp ldi r16, $55 ldi r17, $aa ; Save r16 on the Stack push r16 ; Save r17 on the Stack push r17 ldi r16,$00 ldi r17,$00 ; Restore r17 pop r17 ; Restore r16 pop r16 ldi r16, $55 $55 $00 $085f ldi r17, $aa $55 $aa $085f push r16 $55 $aa $085e push r17 $55 $aa $085d ldi r16,$00 $00 $aa $085d ldi r17,$00 $00 $00 $085d pop r17 $00 $aa $085e 3/8

pop r16 $55 $aa $085f Uwaga W większości procesorów (np. rodzina procesorów x86), a także w procesorze AVR zawartość rejestru wskaźnika stosu jest zmniejszana podczas zapisywania danych na stos 3.3. Inicjalizacja wskaźnika stosu Po uruchomieniu procesora i po sygnale reset, rejestr SP zawiera wartość 0, która stanowi wskaźnik do adresu 0x00. Dlatego aby rozpocząć korzystanie ze stosu należy najpierw zainicjalizować rejestr SP odpowiednią wartością. Częstym rozwiązaniem jest inicjalizacja stosu adresem najwyższej możliwej lokacji w pamięci RAM. Ponieważ różne procesory rodziny AVR posiadają pamięci o różnej wielkości asembler oferuje zdefiniowany symbol ramend, reprezentującą adres ostatniej lokacji RAM. Przykład ldi r16, high(ramend) out sph, r16 ldi r16, low(ramend) out spl, r16 3.4. Funkcje high() oraz low() ;load sph ;load spl Funkcje high() oraz low() zwracają odpowiednio starszy i młodszy bajt 16-bitowej wartości, na przykład: high(0x4455)=0x44 oraz low(0x4455)=0x55. 4. Podprogramy (instrukcja call) Instrukcja call wykorzystywana jest do wywoływania podprogramów. Podprogramy (odpowiednik funkcji w językach wysokiego poziomu) używane są do realizacji często wykonywanych zadań w programie. Pozwala to uzyskać lepszą strukturę programu oraz oszczędza ilość wykorzystywanej pamięci. Aby możliwy był powrót z podprogramu do właściwej instrukcji programu, procesor AVR w trakcie wywołania instrukcji call zapisuje właściwy adres powrotu na stosie (zapisany jest rejestr PC program counter, który wskazujące na kolejną instrukcję do wykonanie po powrocie z podprogramu). Po przejściu do podprogramu instrukcje pobierane są z innych lokacji pamięci. Każdy podprogram musi być zakończony instrukcją powrotu ret w celu ściągnięcia adresu powrotu ze stosu i wykonania skoku do kolejnej instrukcji programu. 4.1. Instrukcja wywoływania podprogramów (call) Instrukcja wywołania podprogramu. Adres powrotu (adres instrukcji po instrukcji call) jest zapisywany na stos. Wskaźnik stosu jest zmniejszany o wartość dwa po wywołaniu call. 4/8

call k ;0 k < 64K PC k STACK PC+2 ; SP SP-2, (2 bytes, 16 bits) 4.2. Instrukcja powrotu z podprogramu (ret) Powrót z podprogramu. Adres powrotu jest pobierany ze stosu. Wskaźnik stosu jest zwiększany o dwa przed odczytem adresu powrotu ze stosu: ret ; SP SP + 2, PC STACK 4.3. Stan rejestrów w trakcie wykonania podprogramów Dobrą praktyką programowania w asemblerze jest zapisywanie wartości rejestrów, które będą wykorzystywane w podprogramie na stosie. Jednym ze sposobów jest użycie instrukcji push oraz pop. Zawartość rejestru wkładamy na stos poprzez instrukcję push na początku podprogramu.w celu odtworzenia stanu programu sprzed wywołania podprogramu, instrukcją pop ściągamy/odczytujemy dane z powrotem na końcu wykonywania podprogramu. Przykład: repeat: ldi r16, $00 ldi r17, $ff out portb, r16 call wait_subroutine out portb, r17 call wait_subroutine rjmp repeat... wait_subroutine: push r16 ; store r16 push r17 ldi r16,100 ; store r17 ; load new value onto r16 outter_loop: ldi r17,10 ; load new value onto r16 inner_loop: nop ; do something in the loop dec r17 brne inner_loop dec r16 brne outter_loop pop r17 pop r16 ret ; repeat it 10 times ; repeat it 100 times ;restore original r17 value ;restore original r16 value 5/8

Ćwiczenie 3.1 Napisz program zliczający na diodach LED z opóźnieniem jednosekundowym. Opóźnienie zrealizuj za pomocą podprogramu. Po zakończeniu ćwiczenia zachowaj program jako one_sec_subroutine.asm 5. Dyrektywy asemblera Program asemblera AVR zaczyna się podczas procesu jego startowania albo resetu od lokacji $0000 w przestrzeni pamięci programowej (PC=0x0000). Aby zadeklarować lokację pamięci, gdzie asembler ma umieścić program można użyć do tego przeznaczonej dyrektywy ORG. Do pamięci programu można załadować nie tylko instrukcje procesora, ale także wartości stałe, które będą dostępne w trakcie wykonania programu. Używając tej możliwości można tworzyć tablice stałych w nieulotnej pamięci programu. Do definiowani zawartości pamięci programu, które nie są instrukcjami procesora służą dyrektywy.db oraz.dw. 5.1. Dyrektywa.ORG Dyrektywa ORG pozwala na ustawienie licznika lokacji w pamięci na wartość podaną jako parametr dyrektywy. Składnia: Example: start: Uwaga.ORG expression.org 0 jmp start ;This instruction will be located at address 0x00 (16-bit words!!!).org 0x32 nop ;This instruction will be located at address 0x32 (16-bit words!!!) nop ;This instruction will be located at address 0x33 (16-bit words!!!) Pamięć programu w procesorze AVR jest pamięcią w któej szerokość pojedynczej komórki pamięci jest 16-bitowa. W przypadku pamięci programu org wskazuje na adres w pamięci 16-bitowej. 6. Rezerwacja pamięci danych Program asemblera ładowany jest do pamięci programu. Istnieje również możliwość zadeklarowania w assemblerze obszaru w pamięci danych. Aby rozdzielić w programie pamięć programową i pamięć danych używa się dyrektyw.cseg oraz.dseg. Dyrektywy.CSEG i.dseg umieszcza się przed następującymi po nich segmentami programu. W praktyce w segmencie.dseg używa się dyrektywy.byte. 6/8

6.1. Dyrektywa BYTE Dyrektywa BYTE rezerwuje zadany obszar pamięć SRAM. Dyrektywa powinna być poprzedzona etykietą w celu możliwości odwoływania się do zarezerwowanej lokacji w pamięci. Dyrektywa wymaga jednego argumentu, który określa liczbę rezerwowanych bajtów. Dyrektywa może być używana jedynie w segmencie danych.dseg. Zarezerwowana w ten sposób lokacja pamięci danych jest nie zainicjalizowana. Składnia: LABEL:.BYTE expression Example:.EQU tab_size=16.cseg.org 0.DSEG.ORG 0x60 rjmp prg var1:.byte 2 table:.byte tab_size.cseg.org 0x32 ;start program memory ;jump to the program ;start data memory ;beginning of the SRAM memory in data space ; reserve 2 bytes to var1 ; reserve 16 bytes ;program memory again prg: nop ; beginning of the program code Uwaga ldi r16,0xaa sts table, r16 ; Store 0xaa at location 0x60 in SRAM Pamięć danych w procesorze AVR jest pamięcią w któej szerokość pojedynczej komórki pamięci jest 8-bitowa. W przypadku pamięci programu org wskazuje na adres w pamięci 8- bitowej. 7. Instrukcje LDS i STS a pamięć danych Instrukcje lds i sts służą do zapisu i odczytu danych z pamięci w rejestrach ogólnego przeznaczenia (instrukcja 2). Można wykorzystać te instrukcje do odczytu/zapisu lokacji pamięci zarezerwowanych poprzez dyrektywę.byte. Przykład:.CSEG.ORG 0.DSEG rjmp prg ;start program memory ;start data memory 7/8

.ORG 0x60 var1:.byte 1.CSEG ;beginning of the SRAM memory in data space ; reserve 1 byte to var1 ;program memory again prg: lds r16, var1 ; example of data memory direct addressing ;... sts var1, r18; call subr lds r19, var1 ; ;pass argument to subroutine using var1 ;receive results form subroutine in var1 subr: lds r20, var1 ;read the subroutine parameter from var1 ; sts var1, r21 ret Przykład 3.2 ; store the result of subroutine execution to var1 Zmień program z ćwiczenia 3.1. Używając.DSEG, zarezerwuj pamięć SRAM. Użyj zarezerwowanej lokacji do przekazania parametru do podprogramu. Użyj tego parametru do zdefiniowania wartości opóźnienia. Zachowaj program jako ' one_sec_subroutine_param.asm' 8/8