Stránka 1 z 6

pettter´s noob faq...

Napsal: 27 úno 2018, 08:34
od pettter
Sorry že otravujem, ale fakt sa na assembler nemám koho spýtať. Všetci (teda žiaľ iba jeden) okolo mňa čo poznám a programujú tak sa vŕtajú v C...
Otázka: direktíva EQU napr.
Pettter EQU 0x00
znamená, že slovo Pettter nesie hodnotu nula (čo celkom vystihuje realitu), alebo že je za slovom Pettter obsah v bunke pameti s adresou 00h?
Alebo:
Jožo EQU 0xFF (sorry Jožo)
znamená že slovo Jožo reprezentuje číslo s hodnotou 255, alebo je to adresa, za ktorou je bunka v pameti a hodnota tej bunky je daná inicializáciou premenných...

Teda je direktíva konštanta s hodnotou, alebo odkaz na adresu? Som s toho akýsi vynulovaný...
Ď za pomoc.
Sa PICnem...[/u]

Napsal: 27 úno 2018, 09:02
od termit256
Reprezentuje jen to cislo. Pokud chces adresu, musis to pettter pouzit v instrukci tak jako adresu.
Nevim jaky MCU programujes, ale napr u x51 znamena
mov a,pettter nahrajes do akumulatoru obsah bunky s adresou pettter
mov a,#pettter nahrajes do akumulatoru hodnotu pettter

snad jsem to napsal srozumitelne.

Napsal: 27 úno 2018, 09:17
od fero_b
EQU je to iste ako v C #define, preprocesor prejde kodom a nahradi v prvom prechode vsetky Petter cislom 0x00 a Jozo cislom 0xFF, a dalej ako mas popisane vyssie, zavisi ako sa toto cislo interpretuje v danom kontexte zavisi od daneho asembleru (moze to predstavovat konstatnu, adresu, offset..)

Napsal: 27 úno 2018, 09:17
od FHonza
u AVR je to takhle:

definuje konstantu s hodnotou nula
.EQU Petter = 0

vyhradí jeden byte v RAM
Petter: .BYTE 1
pak třeba přesun do registru
LDI R28, LOW(Petter)

uloží konstantu do FLASH nebo EEPROM (nutno použít správný segment)
.DB Petter = 0

Napsal: 27 úno 2018, 10:00
od Hill
Assembler je přece jazyk symbolických adres. Jména Pettter i Jožo takové adresy symbolizují, nepotřebuji je tedy pro další sestavování programu znát, překladač si je podle jmen přiřadí sám. Ostatně ty konkrétně přiřazené adresy najdeš po skončení překladu na závěr ve výpisu tabulky adres.
Instrukcí EQU (nebo DB pro ASM80) jsem na příslušnou adresu vložil konkrétní počáteční hodnotu, kterou ale v průběhu programu můžu změnit tím, že příkazem MOV (nebo LD pro Z80 Assembler) do ní z registru procesoru přepíšu jeho momentální obsah. Obdobně z této adresy můžu poslední uloženou hodnotu přepsat do některého z registrů procesoru.

Napsal: 27 úno 2018, 10:11
od FHonza
Bylo by dobré napsat, který konkrétní assembler řešíš. Evidentně je to pro různé µC jiné.

Napsal: 27 úno 2018, 11:27
od termit256
Ja myslim ze to funguje vsude stejne.
Kdyz napises treba:

slepice equ 0x80h
pocet equ 20

instrukci
mov slepice,#pocet
nahrajes do bunky 80h cislo 20

muzes tak pojmenovat prakticky cokoliv, treba
vystup equ p1.21
pojmenujes pin p1.21 a muzes pak v programu pouzivat prehlednejsi nazev vystup misto cisla portu apod. Vyhodu to ma taky v tom, ze pokud chces zmenit port za jiny, prepises to jen v radku s equ a nemusis vyhledavat vsechny vyskyty cisla portu (cehokoliv jineho) v programu.

Napsal: 27 úno 2018, 11:28
od rnbw
EQU nie je instrukcia procesora ale definicia konstanty v jazyku. Najlepsie to napisal fero_b - vyskyt danej konstanty v programe sa nahradi jej hodnotou.

DB tiez nie je instrukcia, ale definicia bajtu v pamati.

Napsal: 27 úno 2018, 12:06
od FHonza
S tím souhlasím, ale reagoval jsem na Hillovo
Instrukcí EQU (nebo DB pro ASM80) jsem na příslušnou adresu vložil konkrétní počáteční hodnotu...

V těch nemnoha assemblerech co si pamatuji, bylo vždy EQU definice konstanty (jako v C #define, v pascalu const, ...) ale nikdy to nebylo vyhrazení paměti (na rozdíl od DB, DW, ...)

Napsal: 27 úno 2018, 17:21
od Hill
Ale v podstatě bylo, jen už si nepamatuju, jak to kdo tehdy pojmenovával: funkce DB nebo DW překladači prostě řekla "na tu adresu, která právě při překladu vyšla první volná, zapiš konstantu uvedenou jako argument a posuň čítač asres o jednu resp. o dvě nahoru". Adresa se zde neuváděla, ta při překladu vyšla automaticky jako první volná, když na DB nebo DW kompilátor narazil.
Protože musela mít jméno, zkompilovaný program pak pracoval s touto konkrétní adresou (nebo jejich párem).

Napsal: 27 úno 2018, 17:50
od lesana87
Pleteš se Hille, EQU nikdy není vyhrazení místa v paměti, je to zkratka equals, česky rovná se, v některých asemblerech se místo EQU dá použít =. Je to definice symbolické konstanty.

Napsal: 27 úno 2018, 18:14
od ZdenekHQ
To mně připomíná krvavé bitky s mým zákazníkem, co se na starý kolena snaží programovat v JSA a nedokáže pochopit, že překladači v základním nastavení je srdečně jedno, jestli je to equ, data, dokonce i bit, pořád je to jen číslo. Konkrétní použití z toho dělá až instrukce, t.j. jestli je tam :

mov a,Petter

nebo

mov a,#Petter

a podobně (nakonec tento případ byl už několikrát zmíněn)

Pak dělá školácké chyby a všechno to svádí na mě a na překladač. A nejraději se topí v tom, že si v přerušení přepisuje registry, acc, C atd. Ale opět za to můžu já.

Napsal: 27 úno 2018, 18:28
od Rako
Tiež sa rehocem, čo za bludy tu inžineri vygrcli. Mládenci dnes vám to natrela ženská. (1:0) pre Lesanu, Lesana :prst:

Napsal: 27 úno 2018, 19:19
od Hill
lesana87 píše:Pleteš se Hille, EQU nikdy není vyhrazení místa v paměti, je to zkratka equals, česky rovná se, v některých asemblerech se místo EQU dá použít =. Je to definice symbolické konstanty.

Díky, žes to upřesnila, fakt už to neumím popsat líp, však už jsem z programování v ASM80 za těch 25 let hodně zapomněl. Hlavně názvosloví, tehdy jsem se o tom neměl ani s kým bavit.
Samozřejmě s tebou souhlasím.
Ovšem nikdy jsem netvrdil, že se definicí DB vyhrazuje místo v pamětí. Jen tolik, že překladač během překladu uloží na první volnou adresu takto definované číslo a jeho adresu uloží do tabulky symbolických adres, s nimiž pracuje, takže ve zkompilovaném programu nic nebrání modifikaci obsahu této adresy.

Napsal: 27 úno 2018, 19:23
od ZdenekHQ
DB zapíše data do programové paměti (nikoliv do RAM), ale pokud před ně nedáš label, nikdy se k těm datům nedostaneš (i když i tady existuje výjimka).

Je to dobrý třeba na texty, předdefinované konstanty atd. Jen to obecně nelze přepsat...