Laboratorium Techniki Mikroprocesorowej 2 - EZ1C600 034
Laboratorium Techniki Mikroprocesorowej 2 - EZ1C600 034
zml: |
equ |
lOOh |
/przykład deklaracji adresów |
zm2: |
equ |
lOlh |
/zmiennych programowych |
sr: |
equ |
102h | |
LD |
A, (zml) |
/pobranie kopii zmiennej zml | |
LD |
B, A |
/umieszczenie jej w rej.B | |
LD |
A, (zm2) |
/pobranie kopii zmiennej zm2 | |
ADD |
A, B |
/sumowanie | |
RR |
A |
/przesunięcie sumy o 1 bit w prawo | |
LD |
(sr)fA |
/zapis wyniku w zmiennej sr |
od operatora symbolizującego podstawienie uzyskanego wyniku operacji opisanej wyrażeniem. Za identyfikatorami lzm1’, ‘zm2’ i ‘sr’ w powyższym opisie kryją się fizyczne adresy tych zmiennych w pamięci operacyjnej procesora. Założono, że dostępne są operacje przesyłające bezpośrednio zawartość wskazanej komórki pamięci do akumulatora A procesora i odwrotnie. Przedstawiony przykładowy opis zakłada też, że rozmiary (ilość bitów) obu zmiennych są jednakowe i równe rozmiarowi słowa maszynowego procesora, tzn. jednostka ALU procesora może wykonać dodawanie tych zmiennych jedną operacją. Implementacja powyższego fragmentu algorytmu w asemblerze procesora Z80 przedstawia się następująco:
Trochę trudniejsza może okazać się implementacja bloków decyzyjnych w asemblerze. Trzeba cały czas (nawet na etapie projektowania algorytmu) pamiętać o tym co oferuje docelowy procesor. Istotna jest dostępna lista rozkazów porównań słów binarnych oraz skoków warunkowych. Na ogół w procesorach znajdziemy od jednego do kilku rozkazów porównania słów binarnych o rozmiarze słowa maszynowego danego procesora. Wynik takiego porównania jest dostępny w postaci specyficznego ustawienia wybranych flag w rejestrze stanu procesora. Najczęściej jest to flaga przeniesienia (Carry Flag) uzupełniona o flagę zera (Zero Flag). Ich stan po wykonaniu rozkazu porównania jest taki jak po odejmowaniu drugiego argumentu tego rozkazu od pierwszego. W przypadku mikroprocesora eZ80 pierwszy argument rozkazu CP to zawsze akumulator A, a podawany jest tylko drugi operand. Przykładowo, blok decyzyjny porównujący dwie zmienne zm1 i zm2:
zm2
przy uwzględnieniu możliwości języka maszynowego eZ80 należałoby przekształcić do:
Program w asemblerze wyglądałby wtedy następująco:
LD A,(zm2) /pobranie zmiennej zml
LD B,A /umieszczenie jej w rej.B
LD A,(zml) /pobranie zmiennej zm2 do A
JR C,mniejsze /skok gdy A<B
Powyższy program wykorzystuje fakt, że rozkaz CP ustawia flagę CY jeżeli zawartość akumulatora A jest mniejsza od wartości wskazanego argumentu (tutaj rejestru B) i jeżeli to zachodzi (flaga CY=1) to nastąpi skok do etykiety 1-10