@korak
U redu. Znaci ubuduce primenjujem takav princip.
@barum
Pazi, stvarno sam prolupao! Medjutim, i u Vasem citatu stoji kljucna rec LABEL. U datasheetu (Assembler/Linker/Librarian User�s Guide) se navodi da oni sluze za prenos sledecih parametara:
section start address
section end address
section size
address
kao i da je upper operand ogranicen na 6 bitova, sto efektno daje 21 bit.
Code:
If upper is used, only bits 16 through 21 of the expression will be used.
Medjutim, uvek bez problema dobijam svih 24 bitova.
Uopste se ne moze pronaci podatak ili primer da se ovi operandi uopste mogu koristiti za prenos parametara makrou.
Zato je upravo upotreba low, high i upper parametara nedovoljno dokumentovana, jer se eto mogu mnogo prakticnije upotrebljavati i za druge stvari, a ne samo za laksi prelazak strana programske memorije (PAGE) sto im je izgleda osnovna funkcija.
Ipak, moguce je unutar makroa procitrati kompletne 32-bitne parametre, po sledecem:
Code:
ime macro Var
movlw Var & H'FF' ; bajt najmanje tezine
...
movlw Var >>D'08' & H'FF'
...
movlw Var >>D'16' & H'FF'
...
movlw Var >>D'24' & H'FF' ; bajt najvece tezine.
...
endm
Pogresio sam kada sam naveo da to (ni prenos labele kao parametra) nije dokumentovano. Ima ga u poglavlju 7 (Macro Language - ko mi je kriv kada retko kada citam priloge). Pre nego sto sam to video koristio sam istu takvu rotaciju, ali nad low, high i upper parametrima.
Ipak, u makro se moze dodati i jedna (ne vise zbog nemogucnosti ubacivanja ENTER karaktera) instrukcija BEZ ZAREZA. Tacnije, moglo bi se ubaciti i vise instrukcija, ali moraju biti odvojene zarezom ili ostalim parametrima. To takodje nije dokumentovano, a moglo bi se iskoristiti.
Nazalost, asembler ima jos mana. Iako je znaci moguce (mada ne i prakticno ispisivati Var >>D'24' & H'FF' bas bi mu falila jedna superupper direktiva) prenositi tridesetdvobitne parametre, iako ih i simulator podrzava, uslovno poredjenje (if direktiva) moze porediti samo oko 28 bitova (nisam tacno proveravao, mozda moze i koji bit vise, ali sigurno ne svih 32 bita).
To znaci da ce uslovno poredjenje ispravno raditi pri
if BROJ == h'F FF FF FF'
ali ne i prilikom
if BROJ == h'FF FF FF FF'.
Naravno i ovo se moze resiti testiranjem trobajtne varijable AND bajta najvece tezine, ali to usporava razvoj programa i cini kod nerazumljivijim nego sto jeste.
Jeste, nacin uvek postoji (ko me uopste tera da koristim makroe), ali ukoliko iziskuje borbu sa asemblerom, cemu sve to.
[Ovu poruku je menjao Stojan Trifunovic dana 15.09.2008. u 17:48 GMT+1]