egzamin z pnp


1.Omów sposób komunikacji aplikacji z urządzeniami I/O.
2. Omów DRIVER_OBJECT.
3. Porównaj mnożenie i dzielenie liczb binarnych typu DB,DW,DD.
4. Zasada tworzenia i wykorzystania makra. Podać przykład.

Ad1.

Omów sposób komunikacji aplikacji z urządzeniami I/O:

System operacyjny Windows 2000/XP zawiera komponenty trybu jądra, które są od siebie

odizolowane programowo i funkcjonalnie. Sterowniki urządzeń wejscia-wyjscia współpracuja przede

wszystkim z takimi komponentami jak:

• zarzadca wejscia-wyjscia (ang. Input/Output Manager);

• mechanizm Plug & Play (ang. Plug & Play Manager);

• mechanizm zarzadzania energii (ang. Power Manager);

• abstrakcyjna warstwa sprzętu (ang. HAL - Hardware Abstraction Layer).

Komponenty te, szczególnie HAL posrednicza przy obsłudze (adan wejscia-wyjscia co schematycznie

przedstawiono na rysunku 2.

Oprogramowanie u(ytkowe pracuje w trybie u(użytkownika. Program, który (ada dostepu do

zasobu sprzetowego, u(ywa interfejsu programowego API (ang. Application Programming

Interface). Interfejs ten udostepniany jest przez biblioteki jądra systemu takie, jak np.

KERNEL32.DLL. Funkcjonalnie operacje wejscia-wyjscia wykonuje komponent zwany zarządca

wejscia-wyjscia (ang. Input/Output Manager), przy czym nie jest to pojedynczy wykonywalny

moduł systemu, a zbiór bibliotek systemowych odpowiedzialnych za usługi systemowe typu

operacje wejscia-wyjscia.

0x01 graphic

Rys. 2. Skrócony diagram mechanizmu komunikacji aplikacji z urządzeniami I/O

W trybie jądra pracuja równie( systemowe funkcje API stosowane do komunikacji z urządzeniami

zewnetrznymi. W pierwszej fazie obsługi (badania wejscia-wyjscia sprawdzane są parametry, z jakimi

funkcja została wywołana. Je(eli wartosci te ingeruja w chronione obszary systemowe, funkcja nie jest

wykonywana. W drugiej fazie tworzone są struktury danych zwane pakietami (adan wejscia-wyjscia (ang.

IRP - I/O Request Packet), które przesyłane są do sterownika urządzenia. W zale(nosci od rodzaju

wykonywanej operacji, sterownik zwraca do systemu pakiet IRP o zawartosci odpowiedniej rodzajowi

wykonanej operacji. Mo(e to być przykładowo:

• komunikat PENDING - informujacy o tym, (e zadanie jest jeszcze wykonywane i system operacyjny

zostanie powiadomiony o jego zakończeniu;

• komunikat SUCCESS - informujacy o tym, (e zadanie zakonczyło się powodzeniem;

• dane, których czytania dotyczyło polecenie wejscia-wyjscia;

• liczba bajtów danych wysłanych do urządzenia, których dotyczyło polecenie wejscia-wyjscia.

Sterownik wykonuje polecenie zawarte w odebranym pakiecie IRP, może to być zapis lub

odczyt określonych portów wejscia-wyjscia lub te( odwzorowanych w pamięć operacyjna

rejestrów urządzenia zewnętrznego. Sterowniki działają w trybie jądra i wykorzystują funkcje

abstrakcyjnej warstwy sprzętu HAL do komunikacji ze sprzętem.

Po zakończeniu operacji wejscia-wyjscia sterownik, poprzez wywołanie odpowiednich funkcji jądra,

uzupełnia danymi pakiet IRP. Następnie system przekazuje dane zawarte w IRP do aplikacji, pozwalając

na dalsze jej wykonywanie.

Współpraca z urządzeniami wejscia-wyjscia pod kontrola systemu Windows 98/Me

Jądro systemu operacyjnego zwane jest zarządca maszyny wirtualnej VMM (ang. Virtual Machinie

Manager), co wynika z jego funkcji w zakresie przydziału zasobów sprzętowych komputera dla aplikacji,

poprzez utworzenie maszyny wirtualnej. Takie rozwiązanie daje możliwość przydziału zasobów

sprzętowych wielu aplikacjom. Architektura VMM stosowana w nowych generacjach systemów

operacyjnych Microsoft jest ta sama, która wprowadził Windows 3.0 (patrz rys. 3), z dodatkowymi

komponentami odpowiedzialnymi za obsługę nowszych urządzeń i 32-bitowych aplikacji (patrz rys. 4).

0x01 graphic

Mechanizmy komunikacji systemu Windows 98/Me z urządzeniami wejscia-wyjscia przedstawia rys.

4. Dla aplikacji 32-bitowych (badania wejscia-wyjscia obsługiwane są przez funkcje API udostępniane

poprzez biblioteki DLL takie jak np. kernel32.dll. W przeciwieństwie do systemów Windows 2000/XP nie

istnieje tu jednak jeden konkretny mechanizm komunikacji ze sterownikami. Każdy rodzaj urządzenia

zewnętrznego komunikuje się z systemem wykorzystując specyficzne dla niego metody, z wyjątkiem

urządzeń obsługiwanych przez sterowniki WDM, których współpraca opiera się o standard pakietów IRP.

0x01 graphic

Na rysunku 4 kolumna środkowa przedstawia mechanizm komunikacji aplikacji Windows 16-

bitowych, a prawa - aplikacji DOS. W obu przypadkach programy zwracają się z (a daniami

bezpośrednio, czy te( pośrednio, do sterownika pracującego w trybie u(użytkownika. Nad dostępem do

zasobów ochronę sprawuje wirtualny sterownik urządzenia pracujący w trybie jądra. Ma on za zadanie

c umożliwić wielu maszynom wirtualnym korzystanie bez konfliktów ze wspólnych zasobów.

Operacje wejscia-wyjscia trybu jądra w Windows 2000/XP wykonywane są w oparciu o standardowa

strukturę IRP, Windows 98/Me korzysta z różnych mechanizmów (np. architektura warstwowa z

przepływem pakietów, pakiety IRP i inne). W przypadku używania sterowników WDM, system korzysta

z modułu NTKERN.VXD, w którym zaimplementowano funkcje w części pokrywające się ze

stosowanymi w systemach Windows 2000/XP. Zadaniem tego modułu jest tworzenie pakietów IRP i

wysyłanie ich do sterowników WDM obsługujących urządzenia. Cały proces realizowany jest tak jak to

zostało wcześniej omówione. Sterowniki urządzeń, teoretycznie, nie są w stanie określić, w jakim

środowisku działają. W praktyce jednak występują sterowniki, WDM, które są niekompatybilne, tzn.

skierowane albo dla Windows 98/Me albo, 2000/XP

Ad. 2

Omów DRIVER_OBJECT.

DRIVER_OBJECT jest tworzony przez sterownik i reprezentuje fizyczne lub

wirtualne urządzenie, które sterownik obsługuje.

DRIVER_OBJECT jest blokiem pamięci umieszczanym i częściowo

inicjalizowanym przez system operacyjny. Ten obiekt opisuje gdzie kod sterownika

jest ładowany do pamięci, nazwę sterownika, oraz zawiera wskaźniki do adresów

funkcji, które sterownik oferuje. Jeden ze wskaźników do adresów funkcji musi być

umieszczony w tablicy wskaźników nazwanej „Function Dispatch Table”.

Ta tablica zawiera wejścia do każdej Major Function Code oferowanej przez

system operacyjny. Obecnie istnieje 28 funkcji, które sterownik może zawierać,

jednak w większości przypadków wystarcza obsługa 8 funkcji: IRP_MJ_CREATE,

IRP_MJ_CLOSE, IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_PNP,

IRP_MJ_POWER, IRP_MJ_DEVICE_CONTROL, IRP_MJ_SYSTEM_CONTROL.

Domyślnie system operacyjny inicjalizuje wejścia do każdej z 28 funkcji,

nawet jeśli sterownik ich nie wykorzystuje. Jakkolwiek użytkownik odwoła się do

urządzenia, system operacyjny wybiera, która funkcja jest odpowiedzialna za

komunikacje z urządzeniem.

DriverObject jest przekazywany jako parametr do DriverEntry przez

I/O Manager. Rozmiar DeviceExtention jest określony w zmiennej

myExtSize, oraz łańcuch Unicode określa nazwę urządzenia -

myDeviceName. Wszystkie dodatkowe dane przechodzą równie"

w tym wywołaniu, takie jak rodzaj urządzenia, charakterystyka, oraz

wszystkie unikalne dane są przekazywane jako wskaźniki do danych

umieszczone w DeviceObject tworzonym przez IoCreateDevice. Te

i inne informacje są ważnymi szczegółami, kiedy konfigurowany jest

sterownik. Więcej danych znajduje się w DDK.

Ad. 3

Porównaj mnożenie i dzielenie liczb binarnych typu DB,DW,DD:


DB - 1-bajtowa liczba całkowita (tyle co rejestr AL)
DW - 2-bajtowa liczba całkowita (tyle co rejestr AX)
DD - 4-bajtowa liczba całkowita (tyle co rejestr EAX)

Mnożenie:

rejestr
wejściowy                 wynik
AL     *     byte     =     AX
AX     *     word     =     DX:AX
EAX    *     dword    =     EDX:EAX

Dzielenie:

implied dividend                         quotient     remainder
AX   
          /          byte      =     AL          AH
DX:AX           /          word      =     AX          DX
EDX:EAX         /          dword     =     EAX         EDX

Ad.4

Zasada tworzenia i wykorzystania makra. Podać przykład:

Ogólnie:

Nazwa makro argumenty

;treść makra

ENDM

Przykład:

RETURN MACRO zmienna

Mov eax,zmienna

Ret

ENDM

Użycie powyższego makra:

RETURN -1;czyli wstawi do eax wartość -1

Asembler analizuje kod i napotykając RETURN -1 wstawi w to miejsce :-1

Mov eax,-1

Ret

Zadania z Masm z czerwca 2007:

1. W masm32 podaj dwa sposoby dowolnej funkcji API.

Odp:

*) Co to jest API:

System Windows przygotowuje dla uruchomionych w nim programów mnóstwo różnych zasobów, których sercem jest Windows API (Application Programming Interface - Interfejs Programowy Aplikacji). Jest to olbrzymi zbiór bardzo użytecznych funkcji, które znajdują się w samym Windows gotowe do wykorzystania przez każdy uruchomiony w tym środowisku program. Funkcje te przechowywane są w kilku dynamicznie dołączanych bibliotekach (DLL - Dynamic Linked Libraries) takich jak kernel32.dll, user32.dll i gdi32.dll.

Oprócz tych "trzech głównych" istnieje wiele innych bibliotek dynamicznych, z których może korzystać twój program, o ile posiadasz wystarczającą ilość informacji o zawartych w nich funkcjach API.

1) Pierwszy sposób:

.386

.MODEL FLAT, STDCALL

OPTION CASEMAP:NONE

INCLUDE \masm32\include\windows.inc

INCLUDE \masm32\include\kernel32.inc

INCLUDELIB \masm32\lib\kernel32.lib

.DATA

.CODE

start:

INVOKE ExitProcess, 0

END start

Program, który natychmiast wraca do windows, jednak jest to poprawny program.

2) Drugi sposób:

2. Napisz funkcje makra dokonującego zerowania akumulatora (EAX). Podaj rozkaz wywołania Makra w kodzie programu.

3. Opisz zasadę sterownia pracą programu z wykorzystaniem skoków warunkowych sterowanie od flag procesora).

4. Porównaj bitowe i selektywne operacje zerowania ustawiania i negowania.

2 kolokwium (Grupa 1 + 2 dla tych którzy nie zdali 1 koła;
i tylko Grupa 2 dla tych którzy koło 1 zdali; )
Grupa 1
1.Wykonaj zamianę bitów: 7 w rejestrze o adr 2FH z bitem 2 ACC
2.Wykonaj operację porównania arytmetycznego zawartości rejestru R5
- Jeżeli wartość R5 jest mniejsza od 100 dokonaj konwersji liczby w kod U2,
- Jeżeli większa lub równa 100 dokonaj konwersji w kod upakowany BCD
Wprowadź stosowne zmienne wskaźnikowe w obszarze pamięci użytkownika.
3.Stosujac pętle programowa (rozkazem CJNE) oraz indeksując rejestr R0 poprzez adresowanie pośrednie, zaadresuj liniowo pamięć od adresu 30H do 40H. Do komórek pamięci wpisz ich adresy.
4.Napisz nagłówek programu w którym:
-konfigurujesz system przerwań dla T0,T1,ES
-przerwanie ES ma najwyższy priorytet
-Timer 0 pracuje w trybie 1, sterowanie od TR0 odmierza czas 20ms
-Timer 1 pracuje w trybie 2, sterowanie od TR1 ustala prędkość 9600bodów dla SMOD=1
Grupa 2
1.W MASM32 opisz sposób przekazywania danych pomiędzy procedurami podprogramów oraz funkcjami API
2.Podaj przykład wprowadzenia własnej kontrolki w programie oraz sposób realizacji sterowania w oparciu o parametr WParam.
3.Omów porównanie logiczne oraz arytmetyczne dla rodziny procesorów (386) i 486.
Omów zasadę sterowania praca programu z wykorzystaniem skoków warunkowych.

Na poprawce 2 koła (1 egzamin) było podobnie (tzn. 2 grupy do pisania dla tych co nie napisali zadanego koła i odpowiednio 3 lub 4 dla osób które nie napisały 1 lub 2 koła!
Grupa 3
1.Omów zasadę komunikacji aplikacji z urządzeniami I/O.
2.Omów Driver-OBJECT.
3.Omów zasadę sterowania oknem aplikacji za pomocą kontrolek.
4.Opisz zasadę tworzenia i podaj przykłady makra.
Grupa 4
1.Omów sposób tworzenia i wykorzystania struktury IRP
2.Omów Driver-OBJECT/(ale chyba nie Object tylko) Device ????
3.Omów zasadę tworzenia okna aplikacji z wykorzystaniem funkcji CreateWindowEx
4.Podaj przykład wywołania okienka dialogowego.

Dodatkowo na poprawkach bywały takie oto pytania wymieszane z pytaniami z kolosów:
• Napisz procedurę obsługi przerwania od T1 w której odświeżasz Timer dla czasu 25ms oraz negujesz bit P1.7. Podaj wymagana konfiguracje dla timera w nagłówku programu;
• Zamień bity R5 banku 0 (7z 1) (wykorzystując bit przeniesienia C)
• API. Co to jest okno aplikacji i jak się je robi i co to jest uchwyt okna?

System Windows przygotowuje dla uruchomionych w nim programów mnóstwo różnych zasobów, których sercem jest Windows API (Application Programming Interface - Interfejs Programowy Aplikacji). Jest to olbrzymi zbiór bardzo użytecznych funkcji, które znajdują się w samym Windows gotowe do wykorzystania przez każdy uruchomiony w tym środowisku program. Funkcje te przechowywane są w kilku dynamicznie dołączanych bibliotekach (DLL - Dynamic Linked Libraries) takich jak kernel32.dll, user32.dll i gdi32.dll.

Oprócz tych "trzech głównych" istnieje wiele innych bibliotek dynamicznych, z których może korzystać twój program, o ile posiadasz wystarczającą ilość informacji o zawartych w nich funkcjach API.

Programy Windows dynamicznie łączą się z tymi bibliotekami DLL, tj. kody funkcji API nie są dołączane do pliku wykonywalnego Windows. Aby twój program wiedział, gdzie znaleźć pożądane funkcje API w czasie swojego wykonania, musisz osadzić tę informację w pliku wykonywalnym. Informacja ta znajduje się w bibliotekach importu. Musisz połączyć swoje programy z właściwymi bibliotekami importu, albo nie będą one potrafiły zlokalizować funkcji API.

666OOO66OO O O 66oooooool Stwórz własny przycisk kończący prace aplikacji.
• Podaj skoki warunkowe procesora (flagi i skoki warunek ze znakiem i bez znaku)



Przed egzaminem surtellos powiedział nam ze biedzie :

- co to jest gapi ?

- jak funkcje api zwracają wartość?

- jakie są wywołania funkcji w api?

- typy driverow ?

- opisy tych typów

- driverobject deviceobject

- driverentry

- różnica między invoke i call

Pytania z mojej grupy z kolosa może się przyda na poprawie.
1) podaj przykłady selektywnego ustawienia ... negowania i zerowania bitów 0,2,3,6 w porcie P1
2) podaj przykłady pośredniego zapisu i odczytu pamięci wewnętrznej danych
3) stosując adresowanie bitowe skopiuj bit 7 portu P1 do bitu 2 rejestru o adresie 20H
4)podaj stany rejestrów IE i IP jeżeli uaktywniamy przerwania od INT1,T0,ES.
ES ma najwyższy priorytet
5)napisz procedurze zamiany zmiennej BIN (30H) w kod U2 (31H) dla liczb z zakresu 0-30H w tym celu wykonaj porównanie arytmetyczne
6)stosując pętle programową (rozkaz DJNZ) oraz indeksując rejestr R1 poprzez adresowanie pośrednie zaadresuj co drugą komórkę pamięci od adresu 30H do adresu 40H
do komórek pamięci wpisz ich adresy

Ponad to z tego co pamiętam co było u nas, to na pewno:
- timery (było coś z równoczesnym startem dwóch timerów w którymś tam trybie)
- konwersja liczb (bcd<->u2, u2<->dec, etc.)
- ANL, ORL, XOR - ustawianie określonych bitów za pomocą maski

0x01 graphic

Grupa I

Cytat:

  1. Omów zasadę komunikacji aplikacji z urządzeniami I/O;

  2. Omów DRIVER_OBJECT;

  3. Omów zasadę sterowania oknem aplikacji, za pomocą kontrolek;

  4. Opisz zasadę tworzenia i podaj przykłady makra.

Grupa II

Cytat:

  1. Omów sposób tworzenia i wykorzystania struktury IRP;

  2. Omów DRIVER_OBJECT;

  3. Omów zasadę tworzenia okna aplikacji z wykorzystaniem funkcji CreateWindowEx;

  4. Podaj przykład wywołania okna dialogowego.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////INNE MATERIAŁY////////////////////////////////////////////////////////////////

(...)
SETB 21H.3H
(...)
Ps. wskazuje ze jest w 8 linii

Powinno być SETB 21H.3 - polecenie to ustawia pojedynczy bit i ta cyfra po kropce określa numer bitu wiec nie potrzebne tam jest to H
(...)

oki a w tym listingu tez mi wyrzuca blad w linii 8
jak robie to
bezpośrednio do akumulatora czyli np SETB ACC.0 to jest wporzadku
(...)

Kod:

(...)
    SETB    25H.0
    SETB    25H.1
    SETB    25H.3
    SETB    25H.5
    SETB    25H.7
(...)

thurek napisał/a:

Wygląda na to, że ta komórka pamięci nie może być adresowana bitowo ale z drugiej strony w książce piszą, że można ją tak adresować (jak każdą z przedziału 20H..2FH). Także nie bardzo wiem co tu może być źle
(...)

stanny napisał/a:

(...)
mysle ze autor w tym zadaniu mial na mysli SETB
ale z tą funckja ... w Jagodzie jest cos nie tak...

W trybie adresowania bitowego mamy do dyspozycji 100h (256) niezależnych bitów. Bity o numerach 00h..7Fh odpowiadają bitom bajtów o adresach 20h..2Fh (w odwrotnej kolejności - tj. bit o numerze 00h odpowiada najmłodszemu bitowi komórki 20h, bit o adresie 07h odpowiada najstarszemu bitowi komórki 20h, bit o numerze 08h odpowiada najmłodszemu bitowi komórki 21h i tak dalej), bity o numerach 80h..FFh odpowiadają poszczególnym bitom bajtów o adresach 80h, 88h, 90h, 9Fh, 0A0h, 0A8h, 0B0h, 0BFh, 0C0h, 0C8h, 0D0h, 0DFh, 0E0h, 0E8h, 0F0h, 0FFh (również w "odwrotnej" kolejności, tj. bit 0E0h odpowiada najmłodszemu bitowi komórki 0E0h, czyli akumulatora (czyli jest równoważny zapisowi ACC.0), bit 0E7h odpowiada najstarszemu bitowi komórki 0E0h (równoważny ACC.7 - można to sobie tak wyobrazić, że do adresu "bazowego" rejestru dodajemy numer bitu - ale tylko dla bitów o numerach > 7Fh), bit 0E8h odpowiada najmłodszemu bitowi komórki 0E8h itp).
Jako operandy instrukcji wykorzystujących adresowanie bitowe podaje się numer bitu.
Asembler do DSM-a zawiera etykiety odpowiadające poszczególnym bitom, w stylu

Kod:

20h.0 equ 0h
20h.1 equ 1h
(...)
20h.7 equ 7h
21h.0 equ 8h
(...)
21h.7 equ 0Fh

stąd w programie w asemblerze można używać wygodniejszej dla człowieka postaci adresu np. 21h.3. W jagodzie nie zadeklarowano takich etykiet, stąd trzeba podawać numer bitu. W każdym razie obie postacie rozkazu (SETB 21h.3 i SETB 0Bh) zostaną zasemblowane w identyczny sposób.

Zapis ACC.3 działa i tu i tu, gdyż taka etykieta o adresie 0E3h została zadeklarowana w Jagodzie, o czym można się przekonać wykonując następujący programik:

Kod:

    LJMP start
    ORG 100h
start:
    MOV A,#ACC.3
    LCALL WRITE_HEX
    LJMP $



[ Dodano: Nie 01 Kwi, 2007 17:25 ]
Uściślając: w asemblerze DSM-51 nie ma zadeklarowanych takich etykiet (tj. 21h.3) - .n to jest operator obliczający adres bitu przy adresowaniu bitowym.

_________________

Kalkulator 3-cyfrowy. Może komuś się przyda na poprawce.

Kod:


; kalkulator 3-cyfrowy by Marek Misztal

    ljmp start
    org 100H

start:
    lcall lcd_clr
   
        ; liczba setek (0-9) pierwszej liczby
    lcall wait_key
    mov R0,A        ; zapis liczby setek do R0 !!!!!!
    lcall write_hex    ; wyświetlanie setek

        ; liczba dziesiatek (0-9) pierwszej liczby
    lcall wait_key
    mov R1,A        ; liczba dziesiątek do R1
    swap A
    mov R2,A

        ; liczba jednosci (0-9) pierwszej liczby
    lcall wait_key
    mov R3,A        ; zapis liczby jedności do R3
    add A,R2        ; dodanie przesuniętej liczby dziesiątek do liczby jedności
    lcall write_hex    ; wyswietlanie reszty

    mov B,#10
    mov A,R1
    mul AB
    add A,R3       
    mov R1,A        ; dziesiątki i jedności dla liczby pierwszej (HEX) w R1 !!!!!
       
    mov A,#'+'
    lcall write_data

        ; liczba setek (0-9) drugiej liczby
    lcall wait_key
    mov R2,A        ; zapis liczby setek do R2 !!!!!
    lcall write_hex    ; wyświetlanie setek

        ; liczba dziesiatek (0-9) drugiej liczby
    lcall wait_key
    mov R3,A
    swap A
    mov R4,A       

        ; liczba jednosci (0-9) drugiej liczby
    lcall wait_key
    mov R5,A   
    add A,R4
    lcall write_hex    ; wyswietlanie reszty

    mov B,#10
    mov A,R3
    mul AB
    add A,R5       
    mov R3,A        ; dziesiątki i jedności dla liczby drugiej (HEX) w R3 !!!!!

    mov A,#'='
    lcall write_data

    mov A,R1
    add A,R3        ; dodanie dziesiątek i jednosci w hex

        ; sprawdzanie czy liczba dziesiątek z jednościami >99
    mov R3,#0
    mov B,#100
    div AB
    jz azero
    mov R3,#1      ; jeśli większa - wstaw do R3 'przeniesienie'
azero:
    mov R1,B    ; reszta z dzielenia przez 100 do R1

    mov A,R0
    add A,R2        ; dodanie setek
    add A,R3        ; dodanie ewentualnego przeniesienia
    acall write_bcd    ; wyświetlenie setek
    mov A,R1       
    acall write_bcd    ; wyświetlenie dziesiątek i jedności
       
    sjmp $

write_bcd:
    mov B,#10
    div AB
    swap A
    add A,B
    lcall write_hex
    ret



oraz wersja z blokadą klawiszy dających wartość A,B,C,D,E,F:

Kod:


; kalkulator 3-cyfrowy by Marek Misztal
    ljmp start
    org 100H

start:
    lcall lcd_clr

cyfr1:
        ; liczba setek (0-9) pierwszej liczby
    lcall wait_key
    mov R0,A        ; zapis liczby setek do R0 !!!!!!
    mov B,#10
    div AB
    jnz cyfr1
    mov A,R0
    lcall write_hex    ; wyświetlanie setek

cyfr2:
        ; liczba dziesiatek (0-9) pierwszej liczby
    lcall wait_key
    mov R1,A        ; liczba dziesiątek do R1
    mov B,#10
    div AB
    jnz cyfr2
    mov A,R1   
    swap A
    mov R2,A

cyfr3:
        ; liczba jednosci (0-9) pierwszej liczby
    lcall wait_key
    mov R3,A        ; zapis liczby jedności do R3
    mov B,#10
    div AB
    jnz cyfr3
    mov A,R3
    add A,R2        ; dodanie przesuniętej liczby dziesiątek do liczby jedności
    lcall write_hex    ; wyswietlanie reszty

    mov B,#10
    mov A,R1
    mul AB
    add A,R3       
    mov R1,A        ; dziesiątki i jedności dla liczby pierwszej (HEX) w R1 !!!!!
       
    mov A,#'+'
    lcall write_data

cyfr4:
        ; liczba setek (0-9) drugiej liczby
    lcall wait_key
    mov R2,A        ; zapis liczby setek do R2 !!!!!
    mov B,#10
    div AB
    jnz cyfr4
    mov A,R2
    lcall write_hex    ; wyświetlanie setek

cyfr5:
        ; liczba dziesiatek (0-9) drugiej liczby
    lcall wait_key
    mov R3,A
    mov B,#10
    div AB
    jnz cyfr5
    mov A,R3
    swap A
    mov R4,A       

cyfr6:
        ; liczba jednosci (0-9) drugiej liczby
    lcall wait_key
    mov R5,A   
    mov B,#10
    div AB
    jnz cyfr6
    mov A,R5
    add A,R4
    lcall write_hex    ; wyswietlanie reszty

    mov B,#10
    mov A,R3
    mul AB
    add A,R5       
    mov R3,A        ; dziesiątki i jedności dla liczby drugiej (HEX) w R3 !!!!!

    mov A,#'='
    lcall write_data

    mov A,R1
    add A,R3        ; dodanie dziesiątek i jednosci w hex

        ; sprawdzanie czy liczba dziesiątek z jednościami >99
    mov R3,#0
    mov B,#100
    div AB
    jz azero
    mov R3,#1      ; jeśli większa &#8211; wstaw do R3 'przeniesienie'
azero:
    mov R1,B    ; reszta z dzielenia przez 100 do R1

    mov A,R0
    add A,R2        ; dodanie setek
    add A,R3        ; dodanie ewentualnego przeniesienia, jeśli suma dziesiątek >=10
    acall write_bcd    ; wyświetlenie setek
    mov A,R1       
    acall write_bcd    ; wyświetlenie dziesiątek i jedności
       
    sjmp $

write_bcd:
    mov B,#10
    div AB
    swap A
    add A,B
    lcall write_hex
    ret



Wyszukiwarka

Podobne podstrony:
Egzamin zaoczne
Pytania egzaminacyjneIM
ANALIZA WYNIKÓW EGZAMINU GIMNAZJALNEGO DLA UCZNIÓW KLAS III
zadania egzaminacyjne
Egzamin 2008 2009
Egzamin poprawkowy I 2009 2010
Egzamin II ze statystyki luty 2007
312[01] 01 122 Arkusz egzaminac Nieznany (2)
Egzamin praktyczny Zadanie Nr 4
konta egzaminacyjne id 246765 Nieznany
EGZAMIN PKM2 pytania2011
na co nalezy zwrocic uwage przygotowujac uczniow do nowego ustnego egzaminu maturalnego
Egzamin z RP2 31 stycznia 2009 p4
piot egzamin
Egzamin 2005 1(1)

więcej podobnych podstron