Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

int21h

Assembler v TP7 a FP


Pokud programujete pokroilej program, tak se bez assembleru neobejdete. Kad jazyk pouv sv metody, jak pst v jazyce symbolickch adres. Je proto dleit si pest, jak se to i ono provd. Turbo Pascal 7 umouje zapisovat assembler plnm nebo Pascalovskm zpsobem.

Ten Pascalovsk je jednodu na pochopen. Ten standardn Vm ale umon obshnout vechny instrukce (v TP7 pouze pro 286 a ni). Protoe se dost asto setkvm s dotazy, e by ten i onen chtl naprogramovat zvukovou kartu i IPX s, avak jeho TP5 neum bloky assembleru nebo nev, jak m pout to i ono, rozhodl jsem se, e Vm uku nkter zkladn konstrukce. Je samozejm nutn, abyste o assembleru u nco vdli.

Nejastjm zpsobem je pistupovn do pamti:

Kdy chcete nap. nco uloit do video pamti v grafickm mdu, provedete to tmto zpsobem:

Mem[$a000:0] := BYTE; (8 bit)
MemW[$a000:0] := WORD; (16 bit)
MemL[$a000:0] := DWORD; (32 bit)
MemL[$a000:0] := (DWORD and $ffffff) or (MemL[$a000:0] and $ff000000)

(24 bit)


V assembleru to zapete nsledovn:

asm  
 push    ds               ; vdy uschovvejte DS registr, pokud
                 ; s nm pracujete. TP7 v nm m toti
                 ; segment Vaich VAR promnnch!
 mov      ax, $a000        ; do seg.registru nelze vkldat pmo
 mov      ds, ax            ; cl je vdy nalevo
 xor      si, si            ; vtinou rychlej ne MOV SI, 0
                 ; ale zase mn Flags
 mov      al, BYTE
 mov     [si], al  ; mono samozejm tak rovnou MOV [SI], BYTE
 mov      ax, WORD
 mov     [si], ax  ; DS je standardn segmentov reg.pro SI
                 ; pro ES by se napsalo MOV ES:[SI], AX                 ; tak je mon zmnit seg.registr pomoc
                 ; prefix, pro ES se pouv 26h          
 db       66h;              ; TP7 nezn 32 bitov instrukce
                 ; prefix 66h mn WORD operand na DWORD
                 ; 67h ($67) mn ADRESU na DWORD!!!
 mov      ax, DWORD
 db      66h;
 mov      [si], ax
 mov     ax, [si]  ; toto naopak pete WORD z [SI]

end;  

Pstup na porty je jednou z dleitch vc, pokud nap. mnte paletu na VGA kart nebo programujete zvukovou kartu. Pozor! Porty nejsou COM a LPT, to jsou rozhran. Takto se d zskat nap. nhodn slo z jednoho z asova PC:

Port[$43] := 0;
BYTE := Port[$40];

V assembleru plat, e pokud chcete pistupovat k portu, jeho slo je men ne 256, mete to provst pmo. K vym muste pout registr DX:

asm  
 mov     al,0
 out     43h,al           
 mov     dx,40h           ; toto je zbyten, protoe $40 <= $ff
 in      al,dx             ; v AL je nhodn slo  

end;  

Funkce v Pascalu vrac sv hodnoty v registrech. Byte se vrac v AL (tedy sta, kdy ped ukonenm funkce vlote svj vsledek do registru AL, nebo mete tak pout @RESULT - tento symbol ale mete pout jen ve funkci a jen tehdy, nen-li za jej hlavikou npis ASSEMBLER;, kter Vm normln umon ji napsat celou podle sebe a navc s uetenm jednoho BEGIN a END;), Word v AX a LongInt nebo typ Pointer ve dvojici DX:AX, kde DX je MSW nebo segment a AX je LSW nebo offset.


Dleitou kapitolou jsou tak peruen. Vdy je nutn naplnit njak ty registry a pak volat pslun peruen.

V TP7 se toto e pkazem INTR (navc muste pout jednotku DOS). Muste si definovat promnnou, kter bude zastupovat registry:

VAR R : registers;

Pak je mete naplnit:

R.AH := 0;

R.AL := $13;

A pot volat peruen:

INTR($10,R);

Tmto jsme zmnili aktivn video md na grafiku v reimu 320x200 a 256 barvch (textov reim 80x25 v 16 barvch, kter je standardn, m slo reimu v AL rovno 3). Nastavit meme tak registry AL a AH s pkazem WITH, kter Vm uet neustl psan toto R:
        with R do
        begin
         AH := 0;
         AL := $13;
        end;  
Ale to se hod jen pokud tch registr mte vce. Jednodu a rychlej je nastavit oba registry souasn pomoc:

R.AX := $13;

Pro DOSov funkce se pouv peruen $21. Mete jej volat stejn jako kad jin, nebo pout:

MSDOS(R);

Kde pedvte jen registry. Ty mete po vykonn peruen tak pest, jako kadou jinou promnnou.

Mnohem rychlej je ale pouit bloku assembleru, kde mte jistotu, kolik instrukc se pouije a nemuste pouvat dal jednotku a definovat promnn (zpis $10 je rovnocenn zpisu 10h, mimo ASM lze ale pout jen $, v ASM lze pout i B pro binrn zpis sla):

asm  
 mov     ax,$13
 int     $10  
end;  

Pokud pechzte na Free Pascal, co je stejn jazyk jako TP7 (ale ji 32 bitov, rychlej, bc ve chrnnm reimu, kde mte sice k dispozci "neomezen" pamti, ale zase Vm z toho plynou dal omezen), mete pouvat samozejm assembler dl, ale bude nutn jej pizpsobit Flat modelu. Tak je nutn si uvdomit, e ve chrnnm reimu nemete jen tak pistupovat na porty a tak lenn pamti je jin.

Free Pascal m oproti Turbo Pascalu 7 tyto zmny:

- je 32 bitov, tedy rychlej na modernch CPU
- me vyuvat vekerou pam potae vetn virtuln (swap)
- obsahuje velk mnostv jednotek
- podporuje instrukce 386, 486, Pentium, MMX, SSE, 3DNow, Pentium II, III a 4, 64 bitov CPU, SSE2 a FPU.
- je na 98% kompatibiln se syntax Turbo Pascalu 7
- podporuje konstrukce C, Delphi, a dal
- lze vytvet aplikace pro DOS, Windows, Linux, a dal
- obsahuje rozshlou dokumentaci (ale jen v anglitin)

FP m jist i dal vhody, ale ty Vs budou zajmat teprve tehdy, a se k nim dopracujete. Pokud pechzte z TP7, je nutn si uvdomit hlavn tyto vci:

- pkaz PORT ji nelze pout bez jednotky PORTS. Lep je ale pouvat pkazy OUTPORTx a INPORTx, kde za X dosadte ku portu (B,W i L). Tyto pkazy lze navc pouvat pouze pod DOSem, nebo-li s vyuitm jednotky GO32.

- peruen INT 21h je funkn pouze v DOSov verzi Vaich program (mete spustit DOSovou verzi pod Windows, ale pokud kompilujete pmo pro Windows nebo Linux, pod tmto peruenm rozhodn nenajdete sluby DOSu).

- pkaz MEM lze pouvat. Ve chrnnm reimu existuj dva typy pamt. DOSov a ta ostatn. Pkazem MEM se dostanete do prvnho 1 MB pamti, co je stejn chovn, jako v TP7. K ostatn pamti se pistupuje pes promnn, kter si definujete pes VAR nebo alokujete na hald pes NEW i GETMEM.

- assembler v FP je vhradn 32 bitov, tedy je nutn s tm potat. Nastavovat registry pes AL nebo AX sice stle jde, ale je to pomalej ne nastaven celho registru EAX. Tak si nap. umdomte, e instrukce LOOP testuje registr ECX, tedy pokud ho nejprve nastavte pomoc CX, asi Vm to nebude fungovat sprvn!

- muste se nauit rozliovat peruen, kter jsou urena pro reln reim a kter pro chrnn.

- Flat model nepouv segmentov registry (vjimka je pstup do DOSov pamti, kterou budete potebovat stle pro pstup do video pamti, pokud nepouvte LFB, pro vyuit DMA, ten BIOSu, atd.). Namsto toho kad registr ESI, atd. u obshne a 4 GB pamti. To je maximln velikost jednoho prostoru, kter se alokuje pes selektor. FP standardn alokuje prostor pro haldu, kde m umstn vechny promnn a uke na nj registry (selektory) DS a ES, kter se pouv i pro pesun (instrukce MOVSx), take s nimi nemuste nijak manipulovat (leda byste run volali njak funkce DOSu, kter je mn - lep je ale pouvat vestavn funkce FP). FP m DOSovou pam tak namapovanou pes selektor FS, tedy na FS:[$a0000] najdete i videopam.

Free Pascal tak umouje pouvat vcero syntaxe assembleru. TP7 pouv standardn syntaxi Intelu, kter spov hlavn v tchto vcech:

- segmentov registr je vdy ped zvorkou ES:[DI]
- clov operand je vdy nalevo
- jmno instrukce neoznauje ku, a je tedy obas nutn ji zadat pomoc ukazatele, kdy se nape: INC BYTE PTR [$10]
- bzov adresovn se zapisuje: FS:[Base+Index*Scale+Offs]
- vzdlen oputn funkce se zape jako RET FAR

Pklad:

asm  
 mov     dx,$80
 in     al,dx
 mov     eax,3
 int     10h  
end;  

FP um ale i AT&T, kter m tyto pravidla:

- instrukce m na svm konci jet udnu ku operand, tj. L pro DOWRD, W pro WORD nebo B pro BYTE
- ped registry se mus uvdt znak %
- bzov adresovn se zapisuje jako: FS:Offs(Base,Index,Scale)
- nalevo je zdrojov operand, clov je napravo
- vzdlen oputn funkce se zape jako LRET
- ped konstantou je nutn pst znak $, kter tedy neznamen hexa!

napklad:

asm  
 movw   $128,%dx
 inb    %dx,%al
 movl   $3,%eax
 int     $16  
end;  

Ale o tom si mete pest v dokumentaci Free Pascalu.
2006-11-30 | Martin Lux