Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Assembler - par dolezitych otazok

Dobry den. Moc rad by som sa spytal niekoho kompetentneho na par otazok ohladom assembleru. Pouzivam GUI Turbo Assembler + Dosbox na spustanie skompilovanych execiek.

1. Ako zadefinujem makra do samostatneho suboru? Poprosil by som podrobny navod a radu.

2. Ako zadefinujem externu proceduru ktora je samostatne kompilovana a prilinkovana k programu? Najlepsie ak by pouzivala zdielany data segment to znamena nastavenie PUBLIC tiez s nejakou ukazkou kodu.

3. Ako by som mal narabat so suborom ked by mal program vypisat obsah suboru s maximalnou velkostou 128kB? Za pouzitia vhodneho buffera pricom by sa zo subora do pamate mala nacitat cela pamat. Tiez by som poprosil nejaku ukazku kodu.

4. Spravil som si macro na nachystanie suboru na citanie ktore by sa malo pouzit 2x no funguje v kode iba ak je pouzite jeden krat inak pise chybu so skokmi ze uz boli raz pouzite "Symbol already defined elsewhere: POKRACUJ" ... tu je ukazka toho macra:

sub_red macro txt                
        mov ah,3DH              ;sluzba BIOSu na otvorenie suboru
        xor al,al               ;open mode, 0 - read only atributa
        mov dx,offset txt+2     ;nastavenie subor, ktory sa bude otvrat
        int 21h
        jnc pokracuj            ;ak nenastala chyba pokracuj v citani
        call clrscr
        VYPIS chyba_sub
        jmp menu_vypis          ;ak nastala chyba skoc na menu
pokracuj:  
        mov HANDLE,ax           ;uloz handle otvoreneho (citaneho) suboru
        xor cx,cx               ;vynuluj cx, kvoli citaniu potrebujeme vynnulovat
        mov ah, 3FH             ;sluzba BIOSu na citanie zo suboru
        mov bx, HANDLE          ;nacitaj handle suboru, z ktoreho chceme citat
endm 

Mam na toto pouzit proceduru a nie macro a preco? Dakujem za vsetky rady :)

Předmět Autor Datum
1. samostatny subor si inkludnes do ineho 2. linkeru das cez parameter kniznicu (.lib) ktoru si si v…
MM.. 12.03.2017 22:51
MM..
K tej 3. napr. takto: - alokujes si 128kB na ds:dx (t.j. 8192 paragrafov). pozn: v DOSe neni az tak…
MM.. 12.03.2017 23:07
MM..
k tomu makru :) 3935 poslední
čitateľ 13.03.2017 10:23
čitateľ

1. samostatny subor si inkludnes do ineho
2. linkeru das cez parameter kniznicu (.lib) ktoru si si vytvoril skompilovanim tych inych funkcii, da sa to tusim aj inac zavisi od presneho pouziteho kompilera a linkera najdi si k tomu navod, to su pojednania na stovky stran, ne na poradnu.
3. na to stacia 2 segmenty (1segment je 64kB). Za predpokaldu ze mas len 16bitovy kod. Nechapem co je na tom problematicke.
4. makro sa vklada do kodu zakazdym ked ho pouzijes. Logicky z toho vyplyva ze tam nemozes mat nejake labely, a vseobecne to je neefektivne, takto sa makra nepouzivaju.
Funkcia je niekde len raz a vola sa cez call.
P.S. v zavislosti od compilera sa da pouzit forward alebo backward label, to sa da pouzit aj v makre. Ale makra sa takto nepouzivaju hlavne aj su tam nejake podmienene skoky inam, tie maju max. rozsah 128bajtov dopredu alebo dozadu, inac bude compiler error.

K tej 3. napr. takto:
- alokujes si 128kB na ds:dx (t.j. 8192 paragrafov). pozn: v DOSe neni az tak nutne ptz DOS nema multitasking a teda mam celu ram pre seba, ale da sa to tusim aj alokovat.
- nacitas napr. 1024Byte do ds:dx
- zvysis ds o 64 (=1024/16), alebo dx o 1024 a az pretecie (CF nastaveny po pripocitani) tak ds zvysit o 4096
- opakujes nacitavanie az kym to nenacita menej (koniec suboru) alebo maximalne 128 krat tych 1024Bytov.

A nauc sa pouzivat funkcie a v nich zachovavat registre (push na zaciatku a pop na konci) a navr.hodnota v CF a AX apod. zavisi od funkcie samozrejme.
C prekladac pouziva stack na parametre funkcii, uklada si na zaciatku funkcie sp do bp a potom [bp+X] su jednotlive parametre, ale u jednoduchsich programov to nepotrebujes.

P.S. namiesto ds pouzi pre ten buffer es alebo iny segment register, nech si nedoseres DS ktory si mal pri spusteni programu, ale je to zhruba fuk. (len potom musis davat pozor ze tvoje "premenne" alebo texty apod potrebuju DS ktore si mal pri spusteni programu)

Zpět do poradny Odpovědět na původní otázku Nahoru