AVSimZ80
Jest to symulator mikroprocesora Z80. Nie jest aż tak źle jak ten program wygląda. Umożliwia pracę w języku asembler – języku, w którym w gruncie rzeczy każde polecenie jest jednocześnie pojedyńczym rozkazem procesora.
Na dobry początek, polecam ściągnięcie tego programu. Jest bardzo stary, ma ponad dwadzieścia lat, także myślę, że mogę go tu zamieścić i nikomu to nie będzie przeszkadzać.
Ściągnij AVSimZ80
Na pierwszych zajęciach jest mowa o teorii, zapoznanie się z nawigacją w programie, oraz jedno zadanie do wykonania. Na początek parę definicji. Nie są one potrzebne na kolokwium, jednakże myślę, że warto je tu wypisać, gdyż prędzej czy później i tak koniecznością będzie je poznać.
Definicje
- Program komputerowy — ciąg instrukcji wykonywanych przez procesor, realizujących określone zadanie.
- Język programowania — to zbiór zasad określających kiedy ciąg symboli stanowi program.
- Język wysokiego poziomu — typ języka programowania, którego składnia i słowa kluczowe mają maksymalnie ułatwić rozumienie kodu programu dla człowieka.
- Język niskiego poziomu — typ języka programowania który wykazuje się dużym podobieństwem do kodu maszynowego.
- Kompilator — to program służący do automatycznego tłumaczenia kodu napisanego w jednym języku na równoważny kod w innym języku.
- Debugger — program służący do analizy innych programów, w celu odnalezienia i identyfikacji zawartych w nich błędów.
Podstawowa nawigacja
- Space — więcej komend
- Esc — tryb ręczny
- Ctrl+C — poniechanie
- F1 — symulacja w biegu (do końca programu, lub do nieskończonej pętli-pułapki)
- F10 — symulacja krok po kroku
Aby wpisać rozkaz do procesora, należy przejść do drugiego menu (Spacja), następnie wcisnąć P (Patch) i jeszcze raz P (Patch Code). Już można pisać. Gdy rozkazy są gotowe, należy wyjść z trybu wpisywania komend (Ctrl+C), przejść do drugiego menu (Spacja), wcisnąć R (Reset), a następnie C (CPU). Teraz pozostaje symulacja. W zasadzie F1 jest bezużyteczne. Zawsze polecam używać F10.
Komendy
Najpierw postaram się wyjaśnić składnię każdego (poznanego na zajęciach) rozkazu.
OPERATION LD rejestr,wartość INC rejestr DEC rejestr JP flaga, adres CP rejestr ADD rejestr,rejestr ADD rejestr,wartość XOR rejestr
KOMENTARZ ; załadowanie do podanego rejestru (A, B, C, D, E) danej wartości ; zwiększenie zawartości rejestru o jeden ; zmniejszenie zawartości rejestru o jeden ; jeżeli sprawdzana flaga jest prawdziwa to ta instrukcja przeniesie nas we wskazany obszar pamięci ; porównanie akumulatora z podanym rejestrem jeżeli wartości są takie same, zmieni się flaga w procesorze ; dodanie pierwszego rejestru do drugiego ; dodanie do rejestru podanej wartości ; wykonanie funkcji XOR na rejestrze
Przydadzą się również przykłady zastosowania tych komend.
OPERATION LD A,A0H LD B,11110000B LD BC,11553D INC A DEC BC JP nz,0000H CP B CP E JP nz,0005H ADD C,B ADD DE,100H XOR A
; do akumulatora zostanie wpisana wartość heksadecymalna A0, czyli decymalne 160 ; do rejestru B zostanie wpisana wartość binarna 11110000, czyli decymalne 240 ; dwa rejestry zostaną połączone, dzięki czemu możesz zapisać dwa bajty pamięci, czyli dość spore liczby, tutaj decymalnie 11.553 ; zwiększenie zawartości akumulatora ; zmniejszenie zawartości rejestrów BC ; jeżeli rejestr A jest zerem wykona się skok ; ten rozkaz porówna rejestr B z akumulatorem jeżeli są równe, flagi zostaną zmienione ; taki zestaw rozkazów powoduje przeskok tylko wtedy gdy akumulator i rejestr E są równe ; do rejestru C dodaj B ; do rejestrów DE dodaj wartość 100H (256) ; xor akumulatora skutkuje wyzerowaniem
Przejdzmy do programów.
Program I
Zadaniem programu jest zmniejszanie podanej zmiennej o jeden, aż stanie się zerem.
ADDR 0000H 0002H 0003H
OPERATION LD A,F1H DEC A JP NZ,0002H
; ładuję heksadecymalną wartość do akumulatora ; zmniejszam wartość akumulatora o jeden ; jeżeli wartość akumulatora nie jest zerem, idź do komórki 0002H
Zauważ, że nie wszystkie rozkazy zajmują tyle samo pamięci. Rozkaz LD zajmuje jeden bajt na "własną deklarację", oraz drugi bajt który jest przypisywaną wartością. To gdzie ta wartość ma zostać wpisana znajduje się już w pierwszym bajcie.
Ten diagram w uproszczonej postaci pokazuje algorytm, który program wykonuje.
Program II
Kolejmy program miał za zadanie tak długo zwiększać zawartość akumulatora, aż zrówna się z wartością w innym rejestrze.
ADDR 0000H 0002H 0003H 0004H 0005H
OPERATION LD B,F1H XOR A INC A CP B JP NZ,0003H
; ładuję określoną wartość do akumulatora ; pamięcio-oszczędny sposób na wyzerowanie ; zwiększam wartość akumulatora o jeden ; porównuję akumulator z rejestrem B ; jeżeli wartość akumulatora nie jest zerem (komparacja była nieprawdziwa), idź do komórki 0003H
W tym programie ma miejsce to zestawienie komendy porównania i skoku, które razem tworzą warunkowanie.
Program III
Następny program działał tak samo ale na liczbach dwubajtowych.
ADDR 0000H 0003H 0006H 0007H 0008H 0009H 000CH 000DH 000EH
OPERATION LD BC,0H LD DE,100FH INC BC LD A,B CP D JP NZ,0006H LD A,C CP E JP NZ,0006H
; zeruję rejestry B i C. ; ładuję 100FH do rejestrów D i E. ; zwiększam wartość rejestrów BC o jeden. ; ładuję rejestr B do akumulatora. ; porównuję akumulator z rejestrem D. ; jeśli komparacja nie udała się idź 0006H. ; ładuję rejestr C do akumulatora. ; porównuję akumulator z rejestrem E. ; jeśli komparacja nie udała się idź 0006H.
Dzięki połączeniu rejestrów możliwe było wprowadzenie do pamięci wartości większej niż 11111111B, 255, FFH. W tym przypadku 100FH, czyli 4111.
Program VI
Zadaniem czwartego programu było zsumowanie cyfr jedności i dziesiątek z dnia i miesiąca urodzin programisty. ;)
ADDR 0000H 0002H 0004H 0006H 0008H 0009H 000AH
OPERATION LD A,1H LD B,4H LD C,1H LD D,0H ADD A,B ADD A,C ADD A,D
; ładuję do akumulatora jedności dnia. ; ładuję do rejestru B dziesiątki dnia. ; ładuję do rejestru C jedności miesiąca. ; ładuję do rejestru D dziesiątki miesiąca. ; dodaję rejestr B do akulumatora. ; dodaję rejestr C do akulumatora. ; dodaję rejestr D do akulumatora.
Na kolokwium możliwe, że będzie wymagana prezencja wyniku w konkretnym rejestrze, a nie w akumulatorze. Wystarczy załadować akumulator do któregokolwiek rejestru i napisać, że tam jest wynik.
Ten artykuł jest niekompletny - nie miałem trzecich zajęć, ponieważ prowadzący był nieobecny. Jeżeli posiadasz dobre sprawozdanie na ten temat, napisz do mnie na Gadu-Gadu: 4875413.