; ****Adresowanie bezposrednie **** .include "m32def.inc" I_O: ser R18 out DDRD, R18 Start: ; etykieta Start ; w adresowaniu bezposrednim nie jest wymagane podawanie LSB i MSB rejestru X, Y, Z ; wystarczy wpisac w rozkaz slowo adresowe, ktore wskaze skad mają zostac pobrane bity ; a nastepnie zaladowane do rejestru roboczego z przestrzeni R0-R31 ldi R20, 55 ; zmienna sts 0x0060, R20 ; wyslij do SRAM bezposrednio pod adres 0x0060 zawartosc R20 dec R20 sts 0x0061, R20 ; wyslij do SRAM bezposrednio pod adres 0x0061 zawartosc R20 dec R20 sts 0x0062, R20 ; wyslij do SRAM bezposrednio pod adres 0x0062 zawartosc R20 nop nop ; w pierwszej kolejnosci sprawdz, co znajduje sie w rejestrach SRAM 0x0060 do 0x0062 ; po rozruchu mikrosterownika i uruchomienia okna Memories z Data Registers lds R0, 0x0060 ;do R0 laduj 8-bitowy rejestr, ktorego adres podano bezposrednio w hex: 0x0060 out PORTD, R0 lds R1, 0x0061 ;do R1 laduj 8-bitowy rejestr, ktorego adres podano bezposrednio w hex: 0x0061 out PORTD, R1 lds R2, 0x0062 ; itd… out PORTD, R2 ; itd… nop nop rjmp Start ; powrot do etykiety Start ;***\\ KONIEC //*** ; ; **** Adresowanie posrednie (X) ; * i adresowanie posrednie z przemieszczeniem (Y) .include "m32def.inc" Start: ; etykieta Start ldi R19, 0b10101111 ; zmienna, ktora ma byc w przyszłosci przechowana w SRAM-ie ; adresowanie posrednie wymaga uzycia rejestrow wskaznikowych, ; w ktorych bedzie znajdowało sie slowo adresowe ; przygotowanie rejestru wskaznikowego do przesłania danych do SRAMu Posrednie: ldi R26, 0x60 ; podaj nowy LSB w X (XL) dla adresu komorki pamieci w SRAM clr R27 ; zerowanie MSB rejestru X (czyli XH) st X, R19 ; pod adresem 0x0060 w SRAM znajdzie sie 0b10101111 nop Posrednie_z_przemieszczeniem: ldi R28, 0x60 ; podaj nowy LSB dla adresu komorki pamieci w SRAM clr R29 ; zerowanie MSB rejestru Y clr R19 ; zerowanie R19 inc R19 ; zwiekszenie o 1 R19 nop std Y+1, R19 ; zawartosc rejestru R19 zapisz w SRAM pod adresem 0x0061 (wynik ; przemieszczenia o 1 wzgledem adresu bazowego 0x0060 w Y) inc R19 ; kolejne zwiekszenie o 1 rejestru roboczego R19 std Y+5, R19 ; zawartosc rejestru R19 zapisz w SRAM pod adresem 0x0065 ; (wynik przemieszczenia o 5 wzgledem adresu bazowego 0x0060 w Y) ; sprawdz w oknie Memories z Data Registers, co znajduje sie w rejestrach SRAM ; od adresu 0x0060 do 0x0065, czy wystepują prawidlowe kopie R19? nop rjmp Start ; powrot do etykieta Start ;***\\ KONIEC //*** ; ; **** Adresowanie posrednie (X), ; * posrednie z przemieszczeniem (Y) ; * i adersowanie posrednie z postinkrementacją (Y) .include "m32def.inc" Start: ldi R18, 0b10101011 ; zmienna, ktora ma byc przechowana w SRAM-ie ; przygotowanie rejestru wskaznikowego clr R26 ; zerowanie LSB rejestru X clr R27 ; zerowanie MSB rejestru X ; przygotowanie słowa adresowego w rejestrze X, za pomocą ktorego wskazuje sie lokalizacje 8-bitowej komorki pamieci ldi R26, 0x70 ; ladowanie LSB rejestru X młodszą czescią slowa adresowego ldi R27, 0x00 ; ladowanie MSB rejestru X młodszą czescia slowa adresowego ; teraz mamy przygotowany wskaźnik położenia komorki pamieci 0x0070 ; przystepujemy do zapełniania pamieci SRAM od adresu 0x0070 Posrednie: st X, R18 ; pod adresem 0x0070 w SRAM znajdzie sie 0b10101011 nop ; kod programu nop ; kod programu ; zapełniamy SRAM, czesc dalsza Posrednie_z_przemieszczeniem: inc R18 ; zwiekszenie o 1 R18 = 0b10101110 ldi R28, 0x70 ; podaj nowy LSB (YL) dla adresu komorki pamieci w SRAM clr R29 ; zerowanie MSB rejestru Y std Y+1, R18 ; załaduj zawartosc R18 do komorki SRAM o adresie 0x0071 nop ; dalszy kod programu nop ; dalszy kod programu ; fragment tabeli zmiennych w SRAM przygotowany Posrednie_z_postinkrementacja: ; postinkrementacje uzywa sie, aby PC po przeprowadzeniu procedury przekazywania danych ; z SRAMu do rejestrow roboczych miał DODATKOWY bonus w postaci automatycznego ; zwiekszenia slowa adresowego w rejestrze wskaźnikowym X, Y, Z nop ; przygotowanie R5 i R6 pod dane z SRAMu clr R5 clr R6 ; i teraz skorzystamy z rejestru wskaźnikowego Y, aby załadowac zmienne do R5, a potem do R6 ; bez koniecznosci recznej aktualizacji LSB rejestru Y ld R5, Y+ ; R5 bedzie miał 0b10101011, ; a przy okazji inkrementujemy rejestr Y (w młodszej LSB) ld R6, Y ; R6 bedzie miał 0b10101110, bo w Y mamy aktualnie adres po inkrementacji 0x0071 nop rjmp Start ; powrot do etykieta Start ;***\\ KONIEC //*** ; ; **** Adresowanie posrednie (X), ; * adresowanie posrednie z przemieszczeniem (Y) ; * i adresowanie posrednie z predekrementacja (Y) ; PB0 z C4 w JP28 ; PB1 z C3 w JP28 ; PB2 z C2 w JP28 ; PB3 z C1 w JP28 ; PA0 = a,... PA1 = b,… PA7 = dp. .include "m32def.inc" I_O: ;ser R18 ;out DDRA, R18 ;out PORTA, R18 ;ldi R18, 0x0F ;out DDRB, R18 ;out PORTB, R18 Start: ldi R21, 0b11000111 ; zmienna 199, ktora ma byc przechowana w SRAM-ie ; przygotowanie rejestru wskaznikowego clr R26 ; zerowanie LSB rejestru X (XL) clr R27 ; zerowanie MSB rejestru X (XH) ; przygotowanie słowa adresowego w rejestrze X, za pomocą ktorego ; wskazuje sie lokalizacje 8-bitowej komorki pamieci ldi R26, 0x80 ; ladowanie LSB rejestru X mlodsza czescia slowa adresowego (XL) ldi R27, 0x00 ; ladowanie MSB rejestru X mlodsza czescia slowa adresowego (XH) ; teraz mamy przygotowany wskaznik polozenia komorki pamieci 0x0080 ; przystepujemy do zapelniania tabeli zmiennych w pamieci SRAM od adresu 0x0080 Posrednie: st X, R21 ; pod adresem 0x0080 w SRAM znajdzie sie 0b11110000 nop ; dalszy kod programu nop ; dalszy kod programu ; zapełniamy SRAM, czesc dalsza Posrednie_z_przemieszczeniem: mov R28, R26 ; robimy kopie LSB X w LSB Y mov R29, R27 ; robimy kopie MSB X w MSB Y inc R21 ; zwiekszenie o 1 R21 std Y+1, R21 ; zaladuj zawartosc R21 do komorki SRAM o adresie 0x0081 inc R21 ; zwiekszenie o 1 R21 std Y+2, R21 ; zaladuj zawartosc R21 do komorki SRAM o adresie 0x0082 inc R21 ; zwiekszenie o 1 R21 std Y+3, R21 ; załaduj zawartosc R21 do komorki SRAM o adresie 0x0083 nop ; dalszy kod programu nop ; dalszy kod programu ; SRAM przygotowany Posrednie_z_predekrementacja: ; predekrementacje uzywa sie, aby PC po przeprowadzeniu procedury przekazywania danych ; z SRAMu do rejestrow roboczych mial DODATKOWY bonus w postaci automatycznego ; zmniejszenia o 1 słowa adresowego w rejestrze wskaźnikowym X, Y, Z ldi R28, 0x83 ; podaj nowy LSB dla adresu komorki pamieci w SRAM clr R29 ; zerowanie MSB rejestru Y nop ; przygotowanie R7, R8, R9 i R10 pod dane z SRAMu clr R7 clr R8 clr R9 clr R10 ; i teraz skorzystamy z rejestru wskaznikowego Y, aby zaladowac R7, a potem R8 i nastepne ; danymi bez koniecznosci recznej aktualizacji LSB rejestru Y ld R7, Y ; R7 bedzie mial 202, ld R8, -Y ;R8 bedzie mial 201, ; bo w Y mamy aktualnie adres po dekrementacji 0x0082 ld R9, -Y ;R9 bedzie mial 200, ; bo w Y mamy aktualnie adres po dekrementacji 0x0081 ld R10, -Y ; R10 bedzie mial 199, ; bo w Y mamy aktualnie adres po dekrementacji 0x0080 nop rjmp Start ; powrot do etykieta Start ;***\\ KONIEC //*** ;