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
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
Moderatorzy:Jacek Bogusz, procesorowiec, r-mik, Moderatorzy
Ostatnio zmieniony 27 mar 2007, o 13:54 przez JacekR, łącznie zmieniany 1 raz.
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]
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]
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.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
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ł
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).
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.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości