Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Instrukcja LDI i rejestr Z

JacekR
-
-
Posty:52
Rejestracja:2 kwie 2004, o 18:43
Lokalizacja:PL
Instrukcja LDI i rejestr Z

Postautor: JacekR » 24 kwie 2004, o 13:00

Witam
zaznaczam ze pisze w asm od kilku tygodni :) i moze pasc pytanie banalne ale ja poprostu nie moge tego zrozumiec :(

mam procedure ktora rozgryzam (oczywiscie tylko fragment)

.DSEG
mulbuf1: .byte 4


ldi ZL,low(mulbuf1)
ldi ZH,high(mulbuf1)

ldi temp1,0xC4
st Z+,temp1

oczywiscie interpretujw to jako - zachowaj zawartosc temp1 w pod adresem wskazanym w Z i przygotuj nastepny adres Z+
ale gdzie szukac Z ? nie rozumiem 2 pierwszych linijek
Ostatnio zmieniony 27 mar 2007, o 13:54 przez JacekR, łącznie zmieniany 1 raz.

Awatar użytkownika
Wojtek
-
-
Posty:868
Rejestracja:21 lut 2003, o 18:21

Postautor: Wojtek » 24 kwie 2004, o 13:38

dseg jest dyrektywą oznaczającą że wszystkie następne zapisy definiją zmienne.
W takim razie dla zmiennej mulbuf1 w pamięci RAM zarezerwowane są 4 bajty, ponieważ byte jest dyrektywą, która rezerwuje w pamięci RAM określony obszar, tak to rozumiem ale ja pewnie wiem jeszcze mniej od Ciebie :) na temat asemblera.

Natomiast Z to jest rejestr indeksowy R31, R30.

[/i]

JacekR
-
-
Posty:52
Rejestracja:2 kwie 2004, o 18:43
Lokalizacja:PL

Postautor: JacekR » 24 kwie 2004, o 13:48

Dziekuje Wojtek za odpowiedz.
To ma sens , nie pomyslalem o tym :(
ale w takim razie jak zareaerwuje to pod jakimi adresami ?
a co jak zapis wyglada tak :

sbuf: .byte 4

ldi ZH,0
ldi ZL,low(sbuf)

i jaka jest roznica miedzy nimi

Awatar użytkownika
Wojtek
-
-
Posty:868
Rejestracja:21 lut 2003, o 18:21

Postautor: Wojtek » 24 kwie 2004, o 15:35

Dziekuje Wojtek za odpowiedz.
To ma sens , nie pomyslalem o tym :(
ale w takim razie jak zareaerwuje to pod jakimi adresami ?
a co jak zapis wyglada tak :

sbuf: .byte 4

ldi ZH,0
ldi ZL,low(sbuf)

i jaka jest roznica miedzy nimi
Gdyby po dseg wystąpiła dyrektywa org, to wtedy wskazałaby ona adres pod jakim zostałaby umieszczona zmienna, brak dyrektywy org oznacza, że zmienna zostanie umieszczana od adresu 60hex czyli od początku wewnętrznej pamięci danych.
Co do drugiego zapisu to ja rozumiem go tak, dla zmiennej sbuf zarezerwowane są 4 bajty pamięci, do rejestru ZH ładowana jest wartość 0 , a do rejestru ZL młodszy bajt zmiennej sbuf. Zastrzegan się, że też poznaję dopiero tajniki uC i asemblera więc mogę się mylić. Przydałby się w tej dyskusji gaweł :)

JacekR
-
-
Posty:52
Rejestracja:2 kwie 2004, o 18:43
Lokalizacja:PL

Postautor: JacekR » 24 kwie 2004, o 15:42

Dzieki za dedukcje podobnie dedukuje kombinujac :)
Wlasnie zaczelem odkrywac tajniki symulatora AVR STUDIO
i faktycznie wszystko sie potwierdza od adresu $60 w wewnetrznej pamieci danych

Awatar użytkownika
Wojtek
-
-
Posty:868
Rejestracja:21 lut 2003, o 18:21

Postautor: Wojtek » 24 kwie 2004, o 16:25

(...)Wlasnie zaczelem odkrywac tajniki symulatora AVR STUDIO(...)
Też korzystam z niego jak również z VisualMicroLab, to już nie jest darmowe IDE ale bardzo dobre.

Awatar użytkownika
gawel
-
-
Posty:683
Rejestracja:24 lis 2003, o 11:19
Lokalizacja:Białystok

Postautor: gawel » 26 kwie 2004, o 08:32

ldi ZL,low(mulbuf1)
ldi ZH,high(mulbuf1)

oznacza pobranie do rejestru Z pełnego adresu zmiennej mulbuf1 (w sensie 16 bitów adresu).

ldi ZH,0
ldi ZL,low(sbuf)

oznacza podobnie jak wyżej pobranie do rejestru Z adresu zmiennej sbuf (w sensie 8 bitów, bo starsza część jest zerowa, co ogranicza adres zmiennej do max 256). Jeżeli te instrukcje są wykonywane w procku, który nie ma więcej pamięci niż 256 bajtów, to nie ma żadnej różnicy w działaniu.
Jeżeli zmienna położona jest na adresie poniżej 256 (a tak musi być w przypadku przykładowo 2313), to kompilator obliczając wartość wyrażenia HIGH(mulbuf1) zamieni to na 0 (zero).
Ostatnio zmieniony 26 kwie 2004, o 13:13 przez gawel, łącznie zmieniany 1 raz.

Awatar użytkownika
gawel
-
-
Posty:683
Rejestracja:24 lis 2003, o 11:19
Lokalizacja:Białystok

Postautor: gawel » 26 kwie 2004, o 08:46

....do rejestru ZL młodszy bajt zmiennej sbuf. ....
Wojtku instrukcja ldi pobiera do rejestru adres zmiennej, więc
zapewne chciałeś napisać"
...do rejestru ZL młodszy bajt adresu zmiennej sbuf...

Awatar użytkownika
Wojtek
-
-
Posty:868
Rejestracja:21 lut 2003, o 18:21

Postautor: Wojtek » 26 kwie 2004, o 20:27

:arrow: gaweł
zgadza się :)

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 10 gości