Dyrektywa .BYTE (AVR)



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Gayos" <gayos_at_nospam_interia.pl>
Subject: Dyrektywa .BYTE (AVR)
Date: Mon, 23 Jul 2001 23:26:04 +0200


Siemanko.

Ja dalej o AVRach.
W sekcji .DSEG programu można zdefiniować zmienne. Ale jak nalezy z nich
korzystac, tzn odczytywac i zapisywac dane do/z rejestrów? Dodam, że chodzi
mi o zmienne tablicowe (wieksze od 1 bajta)
czyli:
zm1 .byte 16 ; zmienna 16-bajtowa

jak uzystac dostep do dowolnego z 16 bajtow?

(Na razie radze sobie przez bezposrednie ladowanie rejestru Y adresem
komorki pamieci).

Przy okazji pytanie drugie. Co sygnalizuje flaga T ? Wydaje mi się, że jest
to flaga do wykorzystania przez program (w dowolnym celu) ale nie mam
pewnosci.

--
Grzesiek Gajewski
gayos_at_nospam_interia.pl




Poprzedni Następny
Wiadomość
Spis treści
From: "Grzegorz Kurczyk" <control_at_nospam_post.pl>
Subject: Re: Dyrektywa .BYTE (AVR)
Date: Mon, 23 Jul 2001 23:56:38 +0200


Użytkownik "Gayos" <gayos_at_nospam_interia.pl> napisał w wiadomości
news:9ji4s9$26o$2_at_nospam_news.onet.pl...
Witam
W sekcji .DSEG programu można zdefiniować zmienne. Ale jak nalezy z nich
korzystac, tzn odczytywac i zapisywac dane do/z rejestrów? Dodam, że
chodzi
mi o zmienne tablicowe (wieksze od 1 bajta)
czyli:
zm1 .byte 16 ; zmienna 16-bajtowa
jak uzystac dostep do dowolnego z 16 bajtow?
(Na razie radze sobie przez bezposrednie ladowanie rejestru Y adresem
komorki pamieci).
Jeśli chodzi Ci o coś w rodzaju indeksu tablicy, to można na dwa sposoby:
1. indeks elementu tablicy jest stałą:
; do rejestru indeksowego np. Z ładujemy adres bazowy tablicy:
ldi r30, low(zm1)
ldi r31, high(zm1)
; w celu pobrania np. czwartego elementu (bajtu) tablicy do np. rejestru R0
dajemy rozkaz
ldd r0, Z+3 ; pierwszy element tablicy ma index 0
2. indeks tablicy jest w rejestrze np. R16
; do rejestru indeksowego np. Z ładujemy adres bazowy tablicy:
ldi r30, low(zm1)
ldi r31, high(zm1)
; do adresu bazowego dodajemy offset do elementu tablicy
add r30, r16
clr r16
adc r31, r16
; w celu pobrania np. czwartego elementu (bajtu) tablicy do np. rejestru R0
dajemy rozkaz
ldd r0, Z


Przy okazji pytanie drugie. Co sygnalizuje flaga T ? Wydaje mi się, że
jest
to flaga do wykorzystania przez program (w dowolnym celu) ale nie mam
pewnosci.

Jest to flaga ustawiana programowo służąca do
testowania/ustawiania/kasowania bitów.

--
Pozdrawiam
Grzegorz

http://www.control.prv.pl
ftp://213.25.234.186
control_at_nospam_post.pl





Poprzedni Następny
Wiadomość
Spis treści
From: "Gayos" <gayos_at_nospam_interia.pl>
Subject: Re: Dyrektywa .BYTE (AVR)
Date: Wed, 25 Jul 2001 00:35:41 +0200


Użytkownik "Grzegorz Kurczyk" <control_at_nospam_post.pl> napisał w wiadomości
news:9ji6li$c82$1_at_nospam_news.tpi.pl...
2. indeks tablicy jest w rejestrze np. R16
; do rejestru indeksowego np. Z ładujemy adres bazowy tablicy:
ldi r30, low(zm1)
ldi r31, high(zm1)
; do adresu bazowego dodajemy offset do elementu tablicy
add r30, r16
clr r16
adc r31, r16
; w celu pobrania np. czwartego elementu (bajtu) tablicy do np. rejestru
R0
dajemy rozkaz
ldd r0, Z

Tak właśnie robię. Ale zaciekawiła mnie możliwość definiowania zmiennych w
asemblerze dyrektywą .BYTE . Niestety nie zostało wyjaśnione jak dostać się
do dowolnego bajtu takiej wielobajtowej zmiennej (jest przyklad zmiennej
1-bajtowej).

--
Grzesiek Gajewski
gayos_at_nospam_interia.pl



Poprzedni Następny
Wiadomość
Spis treści
From: "Grzegorz Kurczyk" <control_at_nospam_post.pl>
Subject: Re: Dyrektywa .BYTE (AVR)
Date: Wed, 25 Jul 2001 08:24:39 +0200


Użytkownik "Gayos" <gayos_at_nospam_interia.pl> napisał w wiadomości
news:9jkt8o$o0t$1_at_nospam_news.onet.pl...
Tak właśnie robię. Ale zaciekawiła mnie możliwość definiowania zmiennych w
asemblerze dyrektywą .BYTE . Niestety nie zostało wyjaśnione jak dostać
się
do dowolnego bajtu takiej wielobajtowej zmiennej (jest przyklad zmiennej
1-bajtowej).

Witam ponownie.
Nie bardzo rozumiem o co Ci chodzi. Tak naprawdę to dyrektywa .BYTE służy
tylko do zarezerwowania w pamięci RAM obszaru o określonej długości (ilości
bajtów) i nie tworzy żadnego określonego typu zmiennej (tak jak np. w
Pascalu lub C)

Dlatego deklaracja typu:
.DSEG
zmienna: .BYTE 4

może być traktowana na wiele sposobów (porównanie do Turbo Pascala):
a) zmienna: longint;
b) zmienna: array[0..1] of integer;
c) zmienna: array[0..1] of word;
d) zmienna: array[0..3] of byte;
e) zmienna: array[0..3] of char;
f) zmienna: array[0..3] of boolean;

Wszystko zależy od algorytmu jakim potraktujesz komórki pamięci RAM
znajdujące się pod adresami zmienna, zmienna+1, zmienna+2 i zmienna+3.

--
Pozdrawiam
Grzegorz

http://www.control.prv.pl
ftp://213.25.234.186
control_at_nospam_post.pl






Poprzedni Następny
Wiadomość
Spis treści
From: "Gayos" <gayos_at_nospam_interia.pl>
Subject: Re: Dyrektywa .BYTE (AVR)
Date: Wed, 25 Jul 2001 23:28:03 +0200


Użytkownik "Grzegorz Kurczyk" <control_at_nospam_post.pl> napisał w wiadomości
news:9jloq4$pqh$1_at_nospam_news.tpi.pl...
Nie bardzo rozumiem o co Ci chodzi. Tak naprawdę to dyrektywa .BYTE służy
tylko do zarezerwowania w pamięci RAM obszaru o określonej długości
(ilości
bajtów) i nie tworzy żadnego określonego typu zmiennej (tak jak np. w
Pascalu lub C)
[...]
znajdujące się pod adresami zmienna, zmienna+1, zmienna+2 i zmienna+3.

Właśnie. Oto przykład z pomocy:
===============
.DSEG
var1: .BYTE 1 ; reserve 1 byte to var1
table: .BYTE tab_size ; reserve tab_size bytes

.CSEG
ldi r30,low(var1) ; Load Z register low
ldi r31,high(var1) ; Load Z register high
ld r1,Z ; Load VAR1 into register 1
===============

Analogicznie do twojego przykladu:

d) zmienna: array[0..3] of byte;
.DSEG
zmienna: .BYTE 4

chcę pobrać z tej tablicy bajt 3 (ostatni):
.CSEG
ldi r30, low(zmienna) ; Load Z register low
ldi r31, high(zmienna) ; Load Z register high
add ZL, 3
ld r1,Z ;ładuj bajt 3
--------------------
albo od razu:
ldi r30, low(zmienna)+3
ldi r31, high(zmienna)
ld r1, Z ;ładuj bajt 3
-------------------
Dobrze to robię czy źle? (nie sprawdzałem w praktyce, tylko teoretyzuje)

--
Grzesiek Gajewski
gayos_at_nospam_interia.pl





Poprzedni Następny
Wiadomość
Spis treści
From: "Juliusz" <jul_at_nospam_fom.pl>
Subject: Re: Dyrektywa .BYTE (AVR)
Date: Thu, 26 Jul 2001 00:49:44 +0200



chcę pobrać z tej tablicy bajt 3 (ostatni):
.CSEG
ldi r30, low(zmienna) ; Load Z register low
ldi r31, high(zmienna) ; Load Z register high
add ZL, 3
ld r1,Z ;ładuj bajt 3

zle !
bo do Z nie mozesz dodac rozkazem add tylko adiw. Nie wiesz ile siedzi
akurat w Zl wiec jesli tam bedzie FF to sie przekreci.

--------------------
albo od razu:
ldi r30, low(zmienna)+3
ldi r31, high(zmienna)
ld r1, Z ;ładuj bajt 3
-------------------
Dobrze to robię czy źle? (nie sprawdzałem w praktyce, tylko teoretyzuje)

To tez zle

ma byc tak:

ldi r30, low(zmienna+3)
ldi r31, high(zmienna+3)


Juliusz




Poprzedni Następny
Wiadomość
Spis treści
From: "Grzegorz Kurczyk" <control_at_nospam_post.pl>
Subject: Re: Dyrektywa .BYTE (AVR)
Date: Thu, 26 Jul 2001 09:18:18 +0200



Użytkownik "Juliusz" <jul_at_nospam_fom.pl> napisał w wiadomości
news:9jnidj$i7l$1_at_nospam_news.tpi.pl...
[ciach]
ma byc tak:
ldi r30, low(zmienna+3)
ldi r31, high(zmienna+3)
Juliusz

Biorąc pod uwagę wszystkie rozwiązania, to w przypadku konieczności pobrania
tylko tego jednego bajtu (ostatniego elementu tablicy), to szkoda na to
rejestru indeksowego, wystarczy tak:

lds r1, zmienna+3

wychodzi krócej i szybciej.
Stosowanie rejestrów indeksowych ma sens przy przenoszeniu bloków danych w
pętli, lub w przypadku wykonywania wiekszej liczby operacji na elementach
tablicy (do rejestru indeksowego ładujemy wtedy adres bazowy tablicy)

--
Pozdrawiam
Grzegorz

http://www.control.prv.pl
ftp://213.25.234.186
control_at_nospam_post.pl





Poprzedni Następny
Wiadomość
Spis treści
From: jfox_at_nospam_friko6.onet.pl (J.F.)
Subject: Re: Dyrektywa .BYTE (AVR)
Date: 26 Jul 2001 16:30:46 GMT


On Wed, 25 Jul 2001 00:35:41 +0200, Gayos <gayos_at_nospam_interia.pl> wrote:
Użytkownik "Grzegorz Kurczyk" <control_at_nospam_post.pl> napisał w wiadomości
ldi r30, low(zm1)
ldi r31, high(zm1)
Tak właśnie robię. Ale zaciekawiła mnie możliwość definiowania zmiennych w
asemblerze dyrektywą .BYTE . Niestety nie zostało wyjaśnione jak dostać się
do dowolnego bajtu takiej wielobajtowej zmiennej (jest przyklad zmiennej
1-bajtowej).

A nie po prostu zm1+n ?
Przyzwoity assembler w definiujac symbol zapamietuje po prostu jego
wartosc a potem wykonuje zapisane operacje. Jedynie w nieprzyzwoitych
[M$] moze sie zdarzyc ze i typ symbolu pamieta ..

J.