asembler.1biber,
>> Imam jedan problem. Naime radim rutinu za DMA prenos. Problem
Kako se programira DMA prenos?
Sta se desava kada procesor pozeli da pristupi memoriji u toku
DMA prenosa?
Ko onda ima prednost? Sta se desava kad procesor pozeli da
pristupi bas delu memorije iz koga se vrsi DMA transfer?
I na kraju da li je moguce pauzirati DMA prenos u proizvoljnom
trenutku i na osnovu stanja nekih registara zakljuciti dokle
se stiglo sa prenosom?
asembler.2nemko,
-> #1, biber)>- Kako se programira DMA prenos?
...
)>- pristupi bas delu memorije iz koga se vrsi DMA transfer?
i
)>- I na kraju da li je moguce pauzirati DMA prenos u
)>- proizvoljnom trenutku i na osnovu stanja nekih registara
)>- zakljuciti dokle se stiglo sa prenosom?
Ako sam "dobro" obavešten ovo poslednje nije moguće.
Nadam se da ćeš odgovore na sva pitanja koja si postavio naći
u dokumetaciji koju šaljem.
Uz poruku dokumentacija o DMA iz PCGPE-a kog sam nedavno ovde slao
i fajl koji objašnjava kako se vrši DMA transfer iz memorije u memoriju
(duplo brže od movs[b,w,d])!!!!!.
Ako neko od vas prokljuvi ovo drugo neka pošalje u obliku funkcije.
dma.zipasembler.3deimos,
-> #1, biber ű>> Kako se programira DMA prenos?
Jednostavno (;)). Evo recepta:
- 1 bafer koji mora da bude na adresi formata X000:0000, sto
znaci da moras da realociras bafer, tj. da ga resize-ujes
sve dok ne bude na takvoj pocetnoj adresi.
- U takav bafer stavis ne vise od 64K podataka.
- 1 DMA channell.
- Odrediti Page, Address i Count registar (hw. port) na sledeci
nacin:
CH0: Addr=0 Count=1 Page=87h
CH1: Addr=2 Count=3 Page=83h
CH2: Addr=4 Count=5 Page=81h
CH3: Addr=6 Count=7 Page=82h
- Konvertovati adresu bafera u 20-bitni format. Kako? Evo ovako:
Ako si se drzalopravila za alociranje bafera, adresu
tipa X000:0000 ces lako pretvorii u X:0000. Od toga 'X'
je PAGE, a '0000' je ADDRESS.
- Maskiras DMA kanal, po principu:
Za DMA (ch0-3) - Mode reg (port) = 0Ah.
Drugi bit maskira kanal, a 0,1 bitovi oznacavaju port,
pa se moze generalno reci: OUT 0Ah,DMA_Channel+4
- Resetujes Flip-Flop registar (hw. port 0Ch) tako sto ces na
njega baciti bilo koju vrednost, npr. 0.
- Izaberes nacin (mode) prenosa peko hw. porta 0Bh. (Za detalje
pogledaj PORTS.LST iz paketa INTERRUPT LIST ili javi ako
ipak hoces da ga opisem ovde). Generalno, za prenos IZ memorije
NA odresiste (deo hardwarea koji podrzava DMA), moze se reci
sledece: OUT 0Bh,DMA_Channel+48h
- ADRESS izbacis na Addr port i to prvo nizi, pa visi bajt.
- Duzinu bafera izbacis na Count port,isto prvo nizi,pa visi bajt.
- PAGE izbacis na Page port (dozvoljene vrednosti 0-Fh).
- Demaskiras DMA kanal (hw. port 0Ah), tako sto na njega, u
principu izbacis samo redni broj kanala koji programiras.
OUT 0Ah,DMA_Channel
- Ovde je kraj sto se tice DMA-a. Sledeci korak je programiranje
uredjaja koji treba da koristi taj DMA kanal.
Kontrola DMA prenosa, tj. pauziranje, i nastavljanje regulise
(ili ne regulise), tj. dozvoljava hardverski uredjaj koji
programiras.
Ako te interesuje kako bi to izgledalo u praksi, javi pa cu da
ostavim ovde deo koda koji sam koristio za programiranje SB-a,
a tice se DMA-a. Poruku sam inace razvukao...
Pozdrav, Vlada.
asembler.4miroslavn,
Ima li neko noviji ASM.NG od 7-15-87 ??????? (duzina 597407)
U ovom čak se ni ne spominju 1.44MB diskete (INT 13), a kamoli
druge novije stvari....
Ako neko ima, molio bih ga da mi se javi na mail. Hvala.
Miroslav
BTW. Ima li neko C ili ASM rutine za rad sa disketama u
nestandardnim formatima (800KB, 1.64MB,...)
BTW.BTW. Tražim i neki noviji C.NG (da ne bude stariji od 5 god.)
asembler.5atech,
-> #2, nemko> Uz poruku dokumentacija o DMA iz PCGPE-a kog sam nedavno ovde
> slao i fajl koji objasnjava kako se vrsi DMA transfer iz
> memorije u memoriju (duplo brze od movs[b,w,d])!!!!!.
Da ga nisi kojim slucajem slao i na pro-ba? :)
Ovde je skoro nemoguce skinuti arhivu od nekoliko stotina kb.
asembler.6biber,
-> #3, deimos>> Kontrola DMA prenosa, tj. pauziranje, i nastavljanje regulise
>> (ili ne regulise), tj. dozvoljava hardverski uredjaj koji
OK. Recimo uredjaj dozvoljava. Dakle zaustavio sam prenos
( recimo ka uredjaju, mada je zanimljivo i obrnuto ).
Kako da saznam dokle smo stigli?
Ili:
Kako da sve vreme prenosa pratim dokle se stiglo?
Ili:
Kako da u proizvoljnom trenutku vremena saznam dokle se
stiglo bez da zaustavljam transfer?
>> Ako te interesuje kako bi to izgledalo u praksi, javi pa cu da
>> ostavim ovde deo koda koji sam koristio za programiranje SB-a,
>> a tice se DMA-a. Poruku sam inace razvukao...
Naravski, interesuje me :)
Kad bi sve poruke bile ovako razvucene pevao bih od radosti.
I to u duetu sa modemom.
Hvala na odgovoru :)
asembler.7biber,
-> #2, nemko>> Uz poruku dokumentacija o DMA iz PCGPE-a kog sam nedavno ovde slao
>> i fajl koji objasnjava kako se vrsi DMA transfer iz memorije u memoriju
Da li znas gde se nalazi "PCGPE"? Pregledao sam ceo PC.PROG.5:asembler,
i ne nadjoh.
asembler.8velicko,
-> #3, deimos>+ ostavim ovde deo koda koji sam koristio za programiranje SB-a,
Ajde ostavi što više koda o programiranju SB-a,
mnogi bi ti bili zahvalni ;)
velicko
asembler.9deimos,
-> #6, biber>> >> Kontrola DMA prenosa, tj. pauziranje, i nastavljanje regulise
>> >> (ili ne regulise(╝ tj. dozvoljava hardverski uredjaj koji
>> OK. Recimo uredjaj dozvoljava. Dakle zaustavio sam prenos
>> ( recimo ka uredjaju, mada je zanimljivo i obrnuto ).
DMA prenos moze da se zaustavlja u oba pravca (opet zavisi
od hardvera).
>> Kako da saznam dokle smo stigli?
Addres Registar, (tj. hw. port DMA_channel * 2) je READ/WRITE,
tako da u svakom trenutku, bilo da je prenos pauziran ili ne,
uvek mozes da proveris trenutni offset bajta u baferu koji biva
prenosen (tako sto citas prvo nizi, pa visi bajt). Isto tako,
je R/W i Count Registar (port DMA_Channel * 2 + 1), koji
citanjem word-a vraca kolicinu bajtova preostalih za prenos.
No Problem.
>> >> Ako te interesuje kako bi to izgledalo u praksi, javi pa cu da
>> Naravski, interesuje me :)
Evo dela koda koji se tice DMA-a. Pisan je u C-u, sto bas i
nije u skaldu sa temom, ali je, mozda, laksi za pregled:
// ----- Cut Here :) --------------------------------------------------
void SetupDMA(char DMA_Channel,unsigned SegAddr,unsigned Length)
// U igri je samo segment bafera, posto se podrazumeva da je bafer na
// adresi tipa X000:0000, pa se podrazumeva i da je offset 0.
{
unsigned int Base,PageReg;
unsigned char Page;
if(DMA_Channel == 0) PageReg = 0x87;
if(DMA_Channel == 1) PageReg = 0x83;
if(DMA_Channel == 2) Pagereg = 0x81;
if(DMA_Channel == 3) Pagereez 0xx2; -
H @ Base = DMA_Channel*2;
Page= (unsigned char) ( ladr >> 12 );
outportb(0x0A, DMA_Channel + 4); // Maskiranje kanala
outportb(0x0C, 0); // Reset Flip-FLop-a
outportb(0x0B, 0x48 + DMA_Channel); // 48h = iz memorije...
outportb(base, 0); // Offset na kome bafer
outportb(base, 0); // pocije.
outportb(base+ 1,((Length<<8)>>8)); // Nizi bajt duzine
outportb(base+ 1,(Length>>8)); // Visi bajt duzine
outportb(PageReg, Page); // Page
outportb(0xa, DMA_Channel); // Demaskranje kanala
}
//----------------------------------------------------------------------
To je sve sto treba da se angazuje DMA.
>> Kad bi sve poruke bile ovako razvucene pevao bih od radosti.
>> I to u duetu sa modemom.
Hvala, hvala... :)
Vlada.
asembler.10deimos,
-> #8, velicko>> Ajde ostavi sto vise koda o programiranju SB-a
Veoma rado, ali je sve uglavnom pisano u C-u, pa ako vam ne smeta,
poslacu iako je tema asm...
Vlada.
asembler.11nemko,
-> #5, atech)>- Da ga nisi kojim slucajem slao i na pro-ba? :)
)>- Ovde je skoro nemoguce skinuti arhivu od nekoliko stotina kb.
Kad dođem u BG poslaću! Podseti me dakle za jedno 10-15 dana u mail.
(Onima kojima je hitno trebao sam slao kući! B))))) )
asembler.12nemko,
-> #7, biber)>- Da li znas gde se nalazi "PCGPE"? Pregledao sam ceo
)>- PC.PROG.5:asembler, i ne nadjoh.
Mislim da je pod RAZNO! Uzgred slao sam bulaji mail da ga prebaci u
direktorijume, ali nije :(((.
asembler.13nemko,
-> #9, deimos)>->> Kad bi sve poruke bile ovako razvucene pevao bih od
)>->> radosti. I to u duetu sa modemom.
)>-
)>- Hvala, hvala... :)
Jedna moja poruka je misteriozno nestala so:
Pošto dobro poznaješ DMA zamolio bih te da pogledaš sledeći tekst i da ga
preradiš u C++ funkciju oblika (ne snalazim se sa ovim najbolje), naravno
ako je upotrebljiv:
boolean fastmove (long Src, long Dest, long Size) {...};
DMA Transfers for FAST Memory Moves
If you ever have the need for super fast moves of blocks of memory and you
can put up with a lot of restrictions in order to gain the speed there is a
method in the PC environment to move bytes at the rate of one every 3 clock
cycles. Compare that to the clocks for a rep movsb and then say that isn't
fast. This isn't for every programmer and it certainly isn't for every time
you need to move a few bytes.
***nemoj mi reći da koristim mowsw ili mowsd, treba mi baš ovo
The DMA chip is a four channel device. Channel 0 is reserved for
refresh of memory that requires at least 256 consecutive bytes be read some-
where in memory at intervals less than about 4ms. The other three channels
are available for such things as transferring information to and from the
disk drives or the ports. Interesting trivia so far, but not very useful in
moving memory around. It gets worse. The 8259 DMA doesn't know anything about
segments. It only knows a 64k universe. This is where the Page registers come
in. The page registers decide which page (on 64k boundaries) the 8259 will
look at for any operation. There are not, as you might guess, 4 page
registers,but only 2 plus a default. If it is not channel 1 or 2 then it uses
the default register programmed as channel 3.
A careful reading of the data sheet of the 8259 discloses that it is
capable of doing a memory to memory transfer but only between channels 0 and
1. That is why this method is a little tricky to use. In order to set up your
own parameters you have to disable the timer from asking for a DMA from chan-
nel 0 every x milliseconds and reconfigure the 8259 and assume the respon-
sibility for doing the memory refresh. It actually sounds worse than it is.
The configuring and re configuring of the 8259 doesn't take all that long, so
the time is made up after only moving a few tens of bytes, and if you move at
least 256 CONSECUTIVE bytes the memory refresh requirement is met for another
2 or 3 milliseconds. The page registers are taken care of by setting channels
1 and 3 to the same value.
Given below is an example of a program I wrote just to test the
idea. A lot of the setup is too complex to explain in this short article, but
if you are interested in checking it all out you will need a data sheet on
the 8259. This worked nicely on my machine and should on most compatibles
just the way it is. With the not-so-compatible it may very well not. I hope
this listing is well enough commented so you can figure it out and make use of
it sometime.
` DMA SOURCE
PAGE 60,132
TITLE DMA MEMORY TO MEMORY
DMA EQU 0
STACK SEGMENT PUBLIC 'STACK'
DB 32 DUP('STACK')
STACK ENDS
DATA SEGMENT PUBLIC 'DATA'
SOURCE DW 08000H
TARGET DW 09000H
NUMBER DW 800H
INCDEC DB 0
PAGER DB 0BH ;PAGE (O TO F)
FILL DB 0 ;2 IF A FILL OP
DATA ENDS
ASSUME CS:CODE,DS:DATA,ES:DATA
CODE SEGMENT PUBLIC 'CODE'
START:
MOV AX,DATA
MOV DS,AX
MOV AX,0B800H
MOV ES,AX
PAGE:
MOV AL,PAGER ;PAGE TO OPERATE IN
OUT 83H,AL
UNDMA:
OUT 0DH,AL ;MASTER RESET OF DMA
MOV DX,03D8H
MOV AL,1
OUT DX,AL
MOV AX,SOURCE ;WHERE IS IT COMING FROM
OUT 0H,AL
MOV AL,AH
OUT 0H,AL
MOV AX,TARGET ;WHERE TO PUT IT
OUT 2H,AL
MOV AL,AH
OUT 2H,AL
MOV AX,NUMBER ;HOW MANY
OUT 3H,AL
MOV AL,AH
OUT 3H,AL
MOV AL,009H ;ENABLE M TO M,COMPRESSED
OR AL,FILL ;WILL BE 2 IF FILL OP
OUT 8H,AL
MOV AL,088H ;BLOCK MODE, INC, READ
OR AL,INCDEC ;WILL BE 20H IF DEC
OUT 0BH,AL
MOV AL,85H ;BLOCK MODE, INC, WRITE
OR AL,INCDEC ;WILL BE 20H IF DEC
OUT 0BH,AL
MOV AL,4 ;THIS IS THE REQUEST
OUT 9,AL ;DO IT
MOV AL,9
OUT DX,AL
RESET: OUT 0DH,AL ;THIS IS A MASTER RESET
OUT 0CH,AL ;RESET F/L F/F
MOV AL,01
OUT 0,AL
OUT 0,AL
REINIT:
MOV AL,0
OUT 83H,AL ;MOVES REFRESH TO BASE PAGE
MOV AL,0FFH
OUT 1,AL
PUSH AX
OUT 1,AL
OUT 0BH,AL
INC AL ;MODE CHAN3
OUT 0BH,AL
PUSH AX
POP AX
POP AX
POP AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
From Issue Three:
In the article about fast memory moves I repeatedly
referred to the 8259 as the DMA processor. The 8259 is the
interrupt controller and has nothing to do with DMA transfers.
asembler.14pedjak,
-> #1, biber> I na kraju da li je moguce pauzirati DMA prenos u proizvoljnom
> trenutku i na osnovu stanja nekih registara zakljuciti dokle
> se stiglo sa prenosom?
Baš pauzirati ne, ali je moguće pratiti preko statusnog registra i
brojača tok prenosa (koliko je bajtova još ostalo za prenos/da li
je prenos završen)
asembler.15deimos,
Svima onima koji su hteli moju biblioteku za SB/SBP, okacena je zajedno sa
sorsom i primerom u temi cccc, poruka 8.6, arhiva SBDEIMOS.RAR.
.dEiMoS.
asembler.16biber,
-> #9, deimos>> uvek mozes da proveris trenutni offset bajta u baferu koji biva
>> prenosen (tako sto citas prvo nizi, pa visi bajt). Isto tako,
Ovo sam vec probao, ali mi uvek vraca 00ff. Mora da sam nesto
pogresio.
Da li sme (il' treba ) da postoji pauza izmedju ocitavanja
nizeg i viseg bajta, npr:
in ....
jmp sled
sled: jmp sled1
sled1: in ....
Sta bi se desilo, pri ocitavanju porta dobijem ofset
0ff ( nizi bajt ), zatim ocitam visi bajt, a ofset se u
medjuvremenu povecao za jedan ( ili vise ). Da li cu dobiti
pogresan rezultat?
asembler.17deimos,
-> #16, biber
Word ces uzeti na sledeci nacin:
PORTVAL dw ?
PUSH AX
PUSH DX
XOR AX,AX
XOR DX,DX
IN AL,_port_
MOV DL,AL
IN AL,_port_
SHL AX,8
ADD AX,DX
MOV PORTVAL,AX
POP DX
POP AX
Ovo je skoro 100% po knjizi, amda moze i da se optimizuje. Pisao
sam isto ovo u ranijim porukama, koliko se secam na sasvim drugaciji
nacin, ali i ovo bi trebalo da radi.
Inace, ne treba ti nikakvo stanje cekanja.
.dEiMoS.
asembler.20konem,
Zna li neko neku dobru knjigu iz koje se moze nauciti
asembler (barem osnove,ako nista vise) ?
asembler.21biber,
-> #20, konem>> Zna li neko neku dobru knjigu iz koje se moze nauciti
>> asembler (barem osnove,ako nista vise) ?
Za knjigu bas i ne znam, ali sledeci fajlovi, koji se nalaze
na SEZAM-u su sasvim dovoljni.
MSDOS - R:\INFOPROG
----------------------
i386 a01 107266* i80386 Programmer's Reference Manual (Intel) #2
i386 arj 108601* i80386 Programmer's Reference Manual (Intel) #1
helppc21 a01 131766* Puno informacija za programere (#2)
helppc21 arj 139216* Puno informacija za programere (ASM, C, DOS, HW,..)(#1)
Najbolji nacin da provalis kako se to radi, je da analiziras
neki tudji program, uz pomoc tabela i informacija iz pomenutih fajlova.
Nadam se da ces naleteti na neki korektno pisan program.
Za pocetak izaberi neki .COM program, po mogucstvu kraci.
Za analiziranje koristi D86. I njega ces naci na SEZAM-u.
Ako ti nesto zapne javi se ponovo.
asembler.22ognjen,
-> #20, konem)-> Zna li neko neku dobru knjigu iz koje se moze nauciti
)-> asembler (barem osnove,ako nista vise) ?
Već si počeo? :)
Što se tiče naših knjiga, slabo stojjimo sa literaturom na tom
polju. Probaj da nabaviš udžbenik za Matematičku Gimnaziju iz
Asemblera. Knjiga za totalne početnike, samo njima može da
pomogne.
Nabavi sve moguće helpove (imaš ih i na sezamu) u elektronskoj
formi u PCu i Asmu: TecHELP, HelpPC, ASM - norton guide, asmtutor.zip...
asembler.23nemko,
-> #20, konem)>- Zna li neko neku dobru knjigu iz koje se moze nauciti
)>- asembler (barem osnove,ako nista vise) ?
P prethodnu konferenciju pc.prog (valjda je to bilo "razno") sam
slao PCGPE (pc games prog. enciclopedia). Tamo se pored razne
dokumentacije nalazi i 12 lekcija programiranja grafike i 3-4
lekcije programiranja u ASM-u.
Dalje ti preporučujem da nepočneš odmah da radiš u TASM-u ili MASM-u
(turbo ili microsoft assempbler) i pišeš gotove programe već da počneš
sa pisanjem manjih rutina u integrisanom assembleru koji se nalazi u
novijim verzijama C++-a ili Pascal-a (zavisi šta voliš).
Korsno je da nabaviš neke dobro komentarisane i korektno pisane programe
koje ćeš da analiziraš.
asembler.24konem,
-> #21, biber>Za knjigu bas i ne znam, ali sledeci fajlovi, koji se nalaze
>na SEZAM-u su sasvim dovoljni.
Ne znam kako da ti se zahvalim, sem :Thanks,biber....
asembler.25konem,
-> #22, ognjen>Vec si poceo? :)
Ne brini, I am harmless. U svakom slucaju, puno hvala na informacijama.
asembler.26konem,
-> #23, nemko> Dalje ti preporucujem da nepocnes odmah da radis u TASM-u ili MASM-u
>(turbo ili microsoft assempbler) i pises gotove programe vec da pocnes
>sa pisanjem manjih rutina u integrsanom assembleru koji se nalazi u
>novijim verzijama C++-a ili Pascal-a (zavisi sta volis).
Thanks nemko, poslusacu tvoj savet.
asembler.27biber,
-> #24, konem>> Ne znam kako da ti se zahvalim, sem :Thanks,biber....
Napisi neki PD program. U asembleru naravno. :)
asembler.28kriss,
-> #21, biber˙˙ Za analiziranje koristi D86. I njega ces naci na SEZAM-u.
˙˙ Ako ti nesto zapne javi se ponovo.
Uz poštovanje prema D86, preporučujem Turbo Dibager, ako uspe da ga
nabavi.
asembler.29kriss,
-> #22, ognjen˙˙ formi u PCu i Asmu: TecHELP, HelpPC, ASM - norton guide,
˙˙ asmtutor.zip...
Ovaj zadnji je bar po meni beskoristan i zbunjuje.
asembler.30kriss,
-> #23, nemko˙˙ P prethodnu konferenciju pc.prog (valjda je to bilo "razno")
˙˙ sam slao PCGPE (pc games prog. enciclopedia). Tamo se pored
Ali još nisi poslao onaj fajl koji ne valja u arhivi.
asembler.31biber,
-> #21, biber
>> Najbolji nacin da provalis kako se to radi, je da analiziras
>> neki tudji program, uz pomoc tabela i informacija iz pomenutih fajlova.
Evo uz poruku ti saljem program HEXDUMP ( source i .com ).
Program nije komentarisan ( na zalost nemam tu naviku ), ali mislim da
ces se snaci, jer je jednostavan.
Inace sintaksa programa je:
HEXDUMP name.ext
Program sluzi za dump listing fajla "name.ext"
Smatraj ga PD.
PS Da se ne zbunis odmah na pocetku, u programu se koriste naredbe
tipa XOR AX,AX sto mu isto dodje kao MOV AX,0, ali zauzima manje mesta
i brze je. Neko voli da koristi i SUB AX,AX sa istim rezultatom, dakle
u registru AX se nadje 0.
Jos jedna caka je OR AX,AX sto mu dodje testiranje da li je AX
jednak nuli ( umesto CMP AX,0 - opet brze i krace )
Samo napred !
hexdump.zipasembler.32konem,
-> #31, biber>Program sluzi za dump listing fajla "name.ext"...
Program je OK.Sve je jasno sem jedne sitnice. Naime, nisam
nasao BREAK sekvencu nigde. Mozda sam neku sitnicu prevideo?
Dugacke fajlove lista, ne odgovarajuci ni na jednu break kombinaciju
tastera.
Ukoliko gresim , bio bih ti zahvalan da mi javis gde. Ako ne,
da li se JUMP na break moze postaviti unutar labele OK: , i kako?
Thanks for everything, biber.
asembler.33pedjak,
-> #17, deimos> Ovo je skoro 100% po knjizi, amda moze i da se optimizuje. Pisao
Kojoj knjizi..?
asembler.34deimos,
-> #33, pedjak>> > Ovo je skoro 100% po knjizi, amda moze i da se optimizuje. Pisao
>> Kojoj knjizi..?
:))) Ne, nisam mislio po nekoj odredjenoj knjizi, vec sam
mislio da je napisano najjasnije sto moze biti.
Sto se tice knjiga za assembler je po meni bila i ostala
najbolja: 8086/8088/80286 Assembly Language. Pisao je Leo J. Scanlon.
Ne znam da li je kod nas izdavana, jer sam imao englesku verziju
(izdavac BREADY).
.dEiMoS.╝á
asembler.35.sima,
Hi
Da li bi neko bio dobar da priloži primer pisanja com programa u
tasm-u.
asembler.36kriss,
-> #35, .sima˙˙ Da li bi neko bio dobar da priloži primer pisanja com programa
˙˙ u tasm-u.
Ja to radim ovako:
.model tiny
.code
org 0100h
start:
(blabla)
end start
asembler.37deimos,
-> #13, nemkoRE: DMA Transfers for FAST Memory Moves
Primer koji je isao uz ovaj tekst, je jednostavno prebaciti
u C, i to sam i ucinio. Medjutim, primer je teoretski i prakticno
neispravan.
>> PAGER DB 0BH ;PAGE (O TO F)
Ovo se odredjuje u zavisnosti od Source/Dest. segmenta.
(PAGER = SHR DESTINATION,8)
>> MOV DX,03D8H
>> MOV AL,1
>> OUT DX,AL
Besmisleno, jer, jeste da je neophodno pobuditi HW uredjaj da bi
reagovao i primio DMA buffer packet, ali CGA mode register nije to :)
>> MOV AX,SOURCE ;WHERE IS IT COMING FROM
>> OUT 0H,AL
>> MOV AL,AH
>> OUT 0H,AL
Ovakvu adresu DMA cip ne prepoznaje ni pod razno, sto se moze
primetiti ako izberemo za odredisnu adresu video memoriju. Ekran ili
bafer ce se puniti od offseta jednakom Source Segmentu, a ne od njegovog
pocetka, sto nikome nije potrebno.
...
Na kraju sam dobio tri verzije koda, i evo sta se desava.
1. ASM: Kod uzet iz poruke bez ikakvih modifikacija:
Buffer se puni nulama od offseta SourceSeg.
2. ASM: Modifikovan i ispravljen kod iz poruke:
Buffer se ispravno puni od pocetka do zadate
duzine, ali se opet puni nulama.
3: C: Identican rezultat kao pod 2.
Posle jaaako puno vremena provedenim nad ovim ( i ja sam se
odusevio idejom ) nisam uspeo da korektno napravim prenos sa sadrzajem
pocetnog bafera u odredisni ( uvek samo nule ). E, sada, ja se pitam da
li je ovo uopste moguce realizovati, jer princip je u tome da on preko
0-tog kanala procita deo memorije, a putem 1-og vrati istu kolicinu u
memoriju na neko drugo mesto. Postavlja se pitanje: GDE ON STAVLJA TAJ
SADRZAJ MEMORIJE U MEDJUVREMENU? Druga stvar je da iz ovakvog koda
DMA nema pojma odakle se vrsi transfer jer je za to neophodan jos jedan
page registar i page vrednost (za source).
Odmah da kazem da, i posle velikog optimizovanja, prenos buffera
(iako praznog) je za desetak puta SPORIJI od Borland C-ovog MOVMEM, a od
MOVSW/MOVSD i vise, tako da znas da se uopste ne radi o nekom brzom prenosu.
U svakom slucaju, necu odmah odustati od ovoga, pa se moze jos i
svasta izroditi :) Samo sam hteo da ti javim, da te ne drzim u neizvesnosti.
.dEiMoS.
PS. Probaj sam da ovo assembliras. Preporucujem ti da na samom pocetku
(posle START:) stavis jedno:
MOV AX,13h
INT 10h
Za source stavi bilo koju adresu, a za destination stavi 0, kao
PAGER stavi 0Ah, a za NUMBER 0FA00h Ovo bi trebalo da uslovi
popunjavanje ekrana. Probao sam da za source uzmem adresu 0:0 jer
tamo sigurno ima necega uvek, ali je rezultat opet isti u sva tri
slucaja - prazan krajnji bafer.
asembler.38willow,
-> #35, .sima> Da li bi neko bio dobar da prilozi primer pisanja com programa u
> tasm-u.
Za pisanje .COM programa preporucujem ti shareware Assembler A86, koji
mozes pokupiti sa Sezama.
Ja iskljucivo njega koristim i mogu tu reci da je zaista izuzetnih
mogucnosti a veoma lak za upotrebu.Sa njim mozes odmah da sednes da
kucas kod , odnosno ne moras da se zamlacujes sa nekim direktivama tipa
"... segment", "model ...", "org ...", itd.
Evo ti primer programa koji ne radi nista ( samo se vraca u DOS ), a koji
ce uspesno biti kompajliran pomocu A86 :
mov ah, 04ch
int 021h
Tvoj program izgleda bukvalno ovako.Dobices odma' .COM program bez
teranja kroz linker i nekog tamo Exe2Bin glupiranja.
A86 je ( po mojim iskustvima ) 100% kompatibilan sa TASM-om i MASM-om, dok
obrnuto ne vazi.
Ako tek pocinjes sa assembler-om, onda ti toplo preporucijem A86 jer
uz izvrstan assembler, dobijas i isto takvo uputstvo, sa mnogo primera.
P.S. U arhivi postoji program FAKE.EXE cija je namena da se reimenuje u
TASM.EXE i da se tako i upotrebljava.
Hello from Willow Valley
asembler.39biber,
-> #32, konem>> Program je OK.Sve je jasno sem jedne sitnice. Naime, nisam
>> nasao BREAK sekvencu nigde. Mozda sam neku sitnicu prevideo?
>> Dugacke fajlove lista, ne odgovarajuci ni na jednu break kombinaciju
>> tastera.
Nigde nema BREAK testiranja. Jednostavno kod mene DOS to lepo
sam detektuje ( dakle radi i ctrl-c i ctrl-break ), a program sam
pisao za sebe pa se nisam ni opterecivao time. A ima tu jos pokoja
sitnica, koja trazi doradu. :)
Cini mi se da postoji neka DOS funkcija koja postavlja nekakav
flag, tako da se pri svakom pozivu neke od DOS funkcija automatski
testiraju BREAK kombinacije. Ocigledno je u mojoj masini po defaultu
taj flag postavljen pa zato nemam problema.
>> da li se JUMP na break moze postaviti unutar labele OK: , i kako?
Cini mi se da ga mozes testirati pozivom BIOS-a:
mov ah,1
int 016
jnz nijedan_taster; ili jz nijedan_taster ( pisem napamet )
or ax,ax
jz break
nijedan_taster:
....
Vise o ovome ces naci u HELPPC.
asembler.40vladoem,
1. Moze li se programski podesiti clock LPT porta, tj.
proizvoljno usporiti slanje signala na stampac?
2. Kako? :)
asembler.41konem,
Posto sam prilicno zelen u ovoj oblasti,evo i jednog zelenog pitanja:
-Kako se prave biblioteke u asembleru?
Jasno mi je da u glavnom programu moram staviti EXTRN ,a u biblioteci
PUBLIC.Problem je sto ne znam kako da napravim od .OBJ fajla .LIB fajl.
Neki su mi govorili da neki Dos-ov program LIB radi to ,ali ja ga ne nadjoh.
Ako neko nesto zna,neka kaze.
Hvala.......
asembler.42djelovic,
-> #41, konem> Jasno mi je da u glavnom programu moram staviti EXTRN ,a u biblioteci
> PUBLIC.Problem je sto ne znam kako da napravim od .OBJ fajla .LIB fajl.
Zavisi koji asembler koristiš?
Kod Borlanda se za pravljenje LIB-ova koiristi program TLIB, dok u
poslednje vreme Majjkrosoftovi proizvodi nemaju svoj LIB, već taj posao radi
linker.
asembler.43konem,
-> #42, djelovic> Kod Borlanda se za pravljenje LIB-ova koiristi program TLIB...
Ako ti nije tesko bio bih ti strasno zahvalan kad bi TLIB.EXE
zakacio uz neku od poruka ili na mail.Ako postoji na Sezamu taj program
samo mi daj pointer.
Hvala.....
asembler.44djelovic,
-> #43, konem> Ako ti nije tesko bio bih ti strasno zahvalan kad bi TLIB.EXE
> zakacio uz neku od poruka ili na mail.
Na žalost, moraćeš da ga potražiš negde drugde - ostavljanje komercijalnih
paketa ili delova komercijalnih paketa na Sezamu nije dozvoljeno.
asembler.46haralampie,
Imam par pitanja...
Sta koristiti, Macro assembler, Turbo assembler, ili ?!
Nisam nasao u doc fajlu da li postoji komanda u assembleru pomocu koje se npr.
na neku labelu ucitava neki fajl sa diska?
Npr..
labelica: incbin "BabaiJa.mod"
Ili se na nesrecu mora svaki fajl prebacivati u
"db" format, ili ucitavati sa diska posto se program startuje?
asembler.47vasic,
-> #46, haralampie> Sta koristiti, Macro assembler, Turbo assembler, ili ?!
Manje-više svejedno. MASM ima neke makroe za strukturirano
programiranje, TASM ima ideal mod sa malo ulepšanom sintaksom, ali ako
misliš da ti se sorsovi prevode sa oba, onda i onako nećeš koristiti ni
jedno ni drugo. :)
> Nisam nasao u doc fajlu da li postoji komanda u assembleru pomocu koje se
> npr. na neku labelu ucitava neki fajl sa diska?
> Ili se na nesrecu mora svaki fajl prebacivati u
> "db" format, ili ucitavati sa diska posto se program startuje?
Naredba ne postoji, ali ni ovo drugo ne mora. Uzmeš BINOBJ, BGIOBJ ili
neki sličan program (BGIOBJ imaš u BGI direktorijumu ako koristiš BC ili
TP) i pomoću njega prevedeš svoj binarni fajl u obj koji posle ulinkuješ
u exe.
asembler.48konem,
Moze li neko iskusniji da objasni strukturu Trojanca.
Prvenstveno me interesuje kako se kaci na izvrsni fajl ...
Thanks in advance.
asembler.49deimos,
1. Trebala bi mi neka dokumentacija sa jako puno primera, bilo u
obliku kompjuterskog doc-a/skupa sorseva, bilo kao knjiga ( u tom slucaju
- gde ima da se nabavi ili bar naslov ), a da se tice programiranja
iskljucivo 386 i visih procesora: da ima objasnjenu konkretnu primenu
virtualnog, native, flat i uopste protected moda (ukljucujuci deskriptore,
selektore...) i da ima sto vise primera za masinski kod i asembler.
2. Bio bih nekom zahvalan kad bi mi dostavio bar najkracu (template)
verziju programa koji radi u 100% protected ili virtuelnom modu.
3. Takodje bih bio zahvalan (a predpostavljam i drugi) kad bi neko
okacio ovde A386 assembler (onaj slican A86 samo za 386+).
Unapred hvala, Vlada.
asembler.50saxon,
-> #49, deimos> 1. Trebala bi mi neka dokumentacija sa jako puno primera, bilo
> u obliku kompjuterskog doc-a/skupa sorseva, bilo kao knjiga ( u
> tom slucaju - gde ima da se nabavi ili bar naslov ), a da se
> tice programiranja
Ne bavim se asemblerom ali imam jednu takvu knjigu koja sam iščitao radi
"opšte kulture":
Ros P. Nelson
Microsoft's 80386/80486 Programming Guide
(Assembly Language Programmer's Guide for 80386SX, 80386DX and 80486)
Second Edition, redmond, Washington 1991.
Knjiga nema gotovih primera ali zato zalazi u vrlo perverzne detalje
svake pojedinačne asemblerske instrukcije, detaljno opisuje sistem
protekcije, pejdžing i keš-menadžment...
asembler.51haralampie,
Nikako ne mogu da nadjem proggy koji ima mogucnost snimanja brusha ili cele
slike u 'RAW'(chunky) formatu. Programi za konvertovanje slika koje imam nemaju
tu mogucnost [Gsw, Vpic]. Konvertuju u sve zivo, ali, u Raw nikako.
Ima li neko neki converter koji bi radio ovaj posao?
asembler.52pedjak,
-> #49, deimos> 1. Trebala bi mi neka dokumentacija sa jako puno primera, bilo u
> obliku kompjuterskog doc-a/skupa sorseva, bilo kao knjiga ( u tom
> slucaju
Pored onoga što ti je preporučio saxon, u elektronskom obliku imaš:
r:/infoprog/
i386 a01 107266 i80386 Programmer's Reference Manual (Intel) #2
i386 arj 108601 i80386 Programmer's Reference Manual (Intel) #1
i387 zip 120306 i80387 Programmer's Reference Manual (Intel)
asembler.53deimos,
-> #50, saxon ű>> Ros P. Nelson
>> Microsoft's 80386/80486 Programming Guide
>> (Assembly Language Programmer's Guide for 80386SX, 80386DX and 80486)
>> Second Edition, redmond, Washington 1991.
Zahvaljujem na informaciji. Knjigu sam video, kao i jos neke slicne
koje se bave suvom teorijom, i to je sve jako lepo, ali kad treba to da se
primeni u praksi dolazi do problema :( , zato i pokusavam da dodjem do nekih
primera... U svakom slucaju, hvala za info.
Vlada.
asembler.54deimos,
-> #52, pedjak>> Pored onoga sto ti je preporucio saxon, u elektronskom obliku imas:
>>r:/infoprog/
>>i386 a01 107266 i80386 Programmer's Reference Manual (Intel) #2
>>i386 arj 108601 i80386 Programmer's Reference Manual (Intel) #1
>>i387 zip 120306 i80387 Programmer's Reference Manual (Intel)
Imam ovo vec odavno. Ovo je jako interesantno za upoznavanje sa
problemom, ali je u praksi to polu primenljivo, a meni trebaju konkretni
primeri... :(
Vlada.
asembler.55kriss,
-> #48, konem˙˙ Moze li neko iskusniji da objasni strukturu Trojanca.
If neki_uslov=nešto_što_se_proverava Then Format(all_drives);
˙˙ Prvenstveno me interesuje kako se kaci na izvrsni fajl ...
Trojanci se ne kače, virusi se kače. Prekopaj malo stare poruke po
PC.UTIL.n:virusi, zna štošta zanimljivog da se nađe ...
asembler.56konem,
-> #55, kriss> Prekopaj malo stare poruke po PC.UTIL.n:virusi, zna stosta zanimljivog da se
> nade ...
Nasao sam manje-vise ono sto me je zanimalo.
Hvala kriss ...
asembler.57nemko,
-> #51, haralampieKonverzija u RAW format slike:
Posao mozes da odradis sa programom ImageAlchemy.
Jedna od njegovih verzija se nalazi i na Sezamu.
asembler.58jablan,
Imam jedno pitanje: Kako da promenim izgled jednog karaktera (font), a
da izbegnem int 10h. Smeta mi ono treperenje ekrana. Kako se to radi u
onim nortonovim utility-jima (mislim na kurzor miša u modu 3)?
asembler.59bkaradzic,
-> #49, deimos
;;; 1. Trebala bi mi neka dokumentacija sa jako puno primera, bilo u
;;; obliku kompjuterskog doc-a/skupa sorseva, bilo kao knjiga ( u tom slucaju
;;; 3. Takodje bih bio zahvalan (a predpostavljam i drugi) kad bi neko
;;; okacio ovde A386 assembler (onaj slican A86 samo za 386+).
Ovakve stvari mozes naci na internetu (ftpmail@grasp.insa-lyon.fr,
ftpmail@lth.se,...), ili na nekom dobrom stranom BBS-u (preporucujem
A.C.E: +33 1 4588 7548, jer ima sve sto te zanima - dir: 78. Programmation
utilitaires).
;;; 2. Bio bih nekom zahvalan kad bi mi dostavio bar najkracu (template)
;;; verziju programa koji radi u 100% protected ili virtuelnom modu.
Uz poruku je Tran-ov PMODE v3.07.
Ako ti ovo nije dovoljno poslacu ti i PMODE v2.51 (ako ga nemas).
fatboy / Hyperopia
pmode.zipasembler.60biber,
????????????? Zasto ovo nece da radi ??????????????
jmp beg
old_vect:dw 0,0
beg: mov ax,03508 ; Get Interupt Vector
int 021
mov [old_vect],bx ; Sacuvaj stari interupt vektor
mov [old_vect+2],es
mov ax,02508 ; Postavi novi interupt vektor
mov dx,inter
;int 021
mov dx,500 ; rezervisemo 500 paragrafa
mov ah,031
int 021 ; Terminate & Stay Resident
inter: jmp d[temp] ; novi interapt. Samo skace na stari
Ovaj program promeni adresu interapta broj 8, tako da pokazuje na novu
rutinu za obradu prekida ( labela "inter" ), koja samo skoci nazad na
staru rutinu, ciju je adresu zapamtila u lokaciji "old_vect"
Prema tome nista mudro, medjutim nece da radi. Zaglavi se !
asembler.61pedjak,
-> #60, biber> ????????????? Zasto ovo nece da radi ??????????????
Kod koji si poslao ima više nejasnoća i grešaka.
> mov ax,02508 ; Postavi novi interupt vektor
> mov dx,inter
> ;int 021
Pozivanje interapta se ne obavi jer se u ovom slučaju to tretira
kao komentar. Dalje, ako bi se i izvršio, ne vidim odavde na šta
ukazuje DS registar (verovatno si ovo isčupao iz nekog većeg
koda). Trebao bi da ukazuje na code segment. Dalje, DX bi morao da
sadrži ofset adrese prekidne rutine, tako da je pravilno:
mov DX, OFFSET inter
> inter: jmp dŠtempĆ ; novi interapt. Samo skace na stari
Ne znam šta je u ovom slučaju to dŠtempĆ, ali bi valjda trebalo do
glasi:
jmp Šold_vectĆ
Pre toga, DS moraš podesiti da ukazuje na tvoj kod segment, u kome
je smeštena adresa stare rutine. Dalje, moraš obezbediti da skok
bude dalek (far). Inače, to što si zamislio može da se reši i
ovako:
inter: push ds
push cs
pop ds
pushf
call far Šold_vectĆ
pop ds
iret
asembler.62vasic,
-> #60, biber> ????????????? Zasto ovo nece da radi ??????????????
> beg: mov ax,03508 ; Get Interupt Vector
> int 021
Ne znam koji asembler koristiš i kako on obeležava hex brojeve, ali
uobičajeno bi bilo:
beg: mov ax,3508h ; Get Interupt Vector
int 21h
> inter: jmp d[temp] ; novi interapt. Samo skace na stari
A ovo mi nije jasno... d[temp]? Tu bih očekivao
inter: jmp dword ptr cs:[old_vect]
ali opet ne znam koji asembler koristiš i da li je ono 'd' skraćenica za
'dword ptr'. Ako jeste, onda je problem u onom 'cs:' koje ti nedostaje.
Kada tvoja interapt rutina dobije kontrolu, jedini registar na čiji se
sadržaj možeš osloniti je cs. A pošto je podrazumevani segmentni
registar za direktno adresiranje ds, eto belaja.
asembler.63bkaradzic,
Turbo Assembler v3.1 BUG! :(
TASM nece da radi * i / racunske operacije sa 32bit brojevima!!!
Primer 1:
mov reg32/mem32,imm32(x / y) prevodi mov reg32/mem32,0
mov reg32/mem32,imm32(x * y) prevodi mov reg32/mem32,0
Primer 2:
xor eax,eax
mov edi,offset blabla
mov ecx,20000h/4
rep stosd
BUG verovatno vazi i za ostale verzije. :_(
fatboy / Hyperopia
asembler.64biber,
-> #62, vasic>> ali opet ne znam koji asembler koristis i da li je ono 'd' skracenica za
>> 'dword ptr'. Ako jeste, onda je problem u onom 'cs:' koje ti nedostaje.
Jeste to je to. Hvala tebi i "pedjak". Puno ste mi pomogli.
PS. Pazi kako jedno malo cs: pravi probleme ;>
asembler.65deimos,
Kako postaviti neki od tweak modova? (npr: 320x240, 360x480... )
asembler.66biber,
-> #64, biber
Uh, ponovo problemi. Gde se sad krije greska ? :(
inter: push ...svi registri
call neki_potprogram ( jako kratak, tako da ne dolazi do usporenja )
pop ...svi registri
cs:
dec b[every]
jnz ne_stari
cs:
mov b[every],16
cs: <-----
jmp d[old_vect]
ne_stari:iret
Dakle "inter" je interapt rutina koja zamenjuje int 08. S obzirom da
sam uradio da se interapt 08 izvrsava 16 puta cesce nego u normalni ( DOS-ov )
interapt 08, definisao sam promenljivu "every", zahvaljujuci kojoj se stari
interapt ( "old_vect" ) izvrsava tek svaki 16-ti put. Medjutim ovako napisan
program nece da radi. Ukoliko labelu "ne_stari" stavim ispred naredbe
oznacene strelicom ( "cs:" ) onda sve radi, ali naravno DOS-ov interapt 08
se onda izvrsava 16 puta cesce, sto nije bas ono sto mi treba.
Unapred hvala na trudu!
asembler.67pedjak,
-> #66, biber> Uh, ponovo problemi. Gde se sad krije greska ? :(
> inter: push ...svi registri
> call neki_potprogram ( jako kratak, tako da ne dolazi do usporenja )
> pop ...svi registri
> jmp dŠold_vectĆ
> ne_stari:iret
Vidi... smisao stavljanja svih registara na stek (ili bar onih koje
koristiš u svojoj prekidnoj rutini) je da se po izlasku iz rutine
njihove vrednosti ne poremete i da na taj način ne utiču na kod
koji se izvršavao pre prekida. Tvoja rutina neki_program sigurno
menja vrednosti nekih registara, tako da je dobro da po ulasku u
svoju prekidnu rutinu sačuvaš registre, ali vraćanje njihovih
originalnih vrednosti je poslednji korak pri izlasku iz rutine.
U gornjem kodu praviš upravu takvu grešku, pri izlasku iz prekidne
rutine sadržaji registara će biti izmenjeni, tj. biće izmenjena
vrednost flag registra. Pre nego što počneš da proveravaš da li je
every=0 gurni flegove na stek i pre skoka na staru rutinu ih skini.
asembler.68biber,
-> #67, pedjak>> U gornjem kodu pravis upravu takvu gresku, pri izlasku iz prekidne
>> rutine sadrzaji registara ce biti izmenjeni, tj. bice izmenjena
>> vrednost flag registra. Pre nego sto pocnes da proveravas da li je
To mi je savrseno jasno, medjutim nije u tome caka. Evo pogledaj
ova dva primera. Razlika je samo u mestu labele "ne_stari".
Desni primer radi i nikako da odgonetnem zasto nece levi.
Ako bi uspeo da provalis izveo bi me iz zone sumraka :)
( Inace radim sa A86 da ne bude zbunjivanja oko b[...] , d[...] i sl.)
Ako je potrebno poslacu ceo listing sa svim inicijalnim delovima,
ali mislim da je sve jasno i ovako.
every: db 16 every: db 16
potprogram: potprogram:
nop nop
ret ret
inter: pushf inter: pushf
call potprogram call potprogram
cs: cs:
dec b[every] dec b[every]
jnz nema jnz ne_stari
cs: cs:
mov b[every],16 mov b[every],16
popf ne_stari:popf
cs: cs:
jmp d[old_vect] jmp d[old_vect]
ne_stari:popf popf
iret iret
asembler.70mmaric,
Da li neko ima lep algoritam za Search po memoriji od 0-4Gb ;)
Da li neko programira u Protected Mod-u. Ako da neka poruku(e)
dostavi na E-Mail.
Da li neko zna ako se nalazim u 386 Protected Modu na koji nacin da
razlikujem Exception-e od Hardveskih Int. kada se preklapaju.
P.S. Treba li nekome rutina za menjanje textualnih stranica
(B800h-B900h-BA00h ...).
Eto, toliko od mene.
asembler.71vasic,
-> #66, biber> Uh, ponovo problemi. Gde se sad krije greska ? :(
> cs:
> dec b[every]
> jnz ne_stari
> cs:
> mov b[every],16
> cs:
> jmp d[old_vect]
> ne_stari:
> iret
Omatorilo se pa to ti je... Gledao sam sinoć ovaj sors i gledao i
gledao... i ništa. :( Tek malopre kad uzeh da odgovorim na pedjak-ovu
poruku moja superbrza memorija sa vremenom pristupa od 24h dala mi je
rešenje.
Elem, ono što ti je pedjak pričao o flegovima nema veze. Kad se desi
interapt (bilo softverski ili hardverski) na stek ne idu samo cs i ip
nego i flegovi. Iret će ih u povratku uredno pokupiti - nije u tome
problem.
Problem je u stonogi pod imenom 8259 Programmable Interrupt Controler.
Da bi procesor primio zahtev za prekid nije dovoljno samo I flag bude
setovan, već i da PIC propusti zahtev do procesora. A neće ga propustiti
ako misli da je u toku obrada nekog prekida višeg prioriteta. I to je
ono što se tebi dešava - izađeš iz interapt rutine bez obaveštenja PIC-u
da je obrada prekida gotova, a pošto je tajmer interapt najvišeg
prioriteta (IRQ0) više ni jedna od periferija nije u stanju da dopre do
procesora. Naravno, BIOS rutina na svom završetku odradi posao sa PIC-om
i zato varijanta u kojoj uvek zoveš stari handler ne blokira.
Posle sve ove priče, rešenje je sasvim jednostavno. Treba između labele
ne_stari i iret-a da ubaciš sledeće dve linije...
mov al,20h
out 20h,al
...i da ne zaboraviš da sačuvaš vrednost ax. :) Naravno, sve ovo važi
samo za prekide koje generiše hardver. U slučaju softverski generisanih
prekida (10h, 21h, 2Fh,...) PIC nema nikakvu ulogu i nikakvi out-ovi
nisu potrebni.
asembler.72banga,
-> #68, biber> Desni primer radi i nikako da odgonetnem zasto nece levi.
> jnz nema jnz ne_stari
^^^^ a gde ti je ovo?
asembler.73biber,
-> #72, banga>>> jnz nema jnz ne_stari
>> ^^^^ a gde ti je ovo?
Ma pusti, prepisujem, kombinujem, jodlujem ... i naravno da uvek
nesto pogresno prepisem.
Tu treba da stoji isto kao i sa desne strane tj. jnz ne_stari.
Inace oba primera su ista, sem mesta gde se nalazi labela "ne_stari"
Hvala na trudu oko analiziranja! Inace jos nisam resio problem,
a potegao sam i za SoftIce-om. ( nemas pojma kako me mrzi da provaljujem
kako se radi sa njim )
asembler.74biber,
-> #71, vasic>> Omatorilo se pa to ti je... Gledao sam sinoc ovaj sors i gledao i
>> gledao... i nista. :( Tek malopre kad uzeh da odgovorim na pedjak-ovu
Gledam ja vec vise noci ... :(
>> poruku moja superbrza memorija sa vremenom pristupa od 24h dala mi je
Cuti, dobro je i to dok radi sa 0 WS. :))
>> Posle sve ove price, resenje je sasvim jednostavno. Treba izmedu labele
>> ne_stari i iret-a da ubacis sledece dve linije...
>>
>> mov al,20h
>> out 20h,al
E ovo nikad ne bih provalio, mada sam u ocajanju poceo da analiziram
DOS interapt rutinu, ali do ovoga nisam stigao.
Nego jesi li video kako je DOS ruzno pisan ( kod )
Puno ti hvala na odgovoru i trudu oko analiziranja!
asembler.75deimos,
Hitno!
Ako neko ima neku dokumentaciju (pozeljno sa primerima u bilo
kom jeziku) za pristupanje FDD/HDD-u na najnizem nivou, tj
preko portova. Da pojasnim, treba mi konkretan opis sekvenci
za citanje, pisanje, seek...
Hvala unapred!
asembler.76mmaric,
-> #75, deimosMislim da tako nesto imas u HELP PC paketu , kon¸okkretno u fajlu
ports.txt ili tako nesto. Ako ga ne nadjes ovde na Sezam-u pisi mi
poslacu ti ga.
Marko.
asembler.77deimos,
-> #76, mmaric Imam HELP PC, ali mi ne resava problem. Kao prvo, tamo nema
nista za HDD, a i podatci su dosta bajati, kao drugo, mislio sam da
neko ima gotov primer u asm-u,c-u... :((
asembler.78speedy,
-> #77, deimos
Ja sam te stvare provalio disaseblirajuci BIOS-ovu rutinu za read i write...
Glavna je fora da citas sa rep insw (znaci wordove)... Naravno pre toga cli...
Otprilike je sledeca logika : napunis registre glave,sektora i cilindra kako
treba i onda izvrsis out na command port sa odgovarajucom komandom... Onda
Pre toga zakacis odgovarajuci interapt (cini mi se da je IRQ 15 za primary
port a IRQ 14 za secondary) i kad se on desi procitas sektor (256 wordova).
Onda opet cekas (ako treba), ucitas 256 worda sa data registra (1f0 za prvi
port valjda) itd... Za FDD nisam gledao ali to je drugaciji sistem... Ako
te jos nesto interesuje pitaj...
Speedy
asembler.79biber,
Da li je moguce sa HD komunicirati na sledeci nacin:
Zada mu se komanda da pomeri glave na taj i taj cilindar,
i za vreme dok HD to radi, glavni program radi nesto
drugo. Kad glave stignu na odrediste HD generise interapt
i onda mu se nalozi da ucita neki sektor sa tog cilindra,
ili jos bolje sve sektore sa cilindra ( za odredljenu glavu )
asembler.80janko,
-> #79, biber
> Da li je moguce sa HD komunicirati na sledeci nacin:
> Zada mu se komanda da pomeri glave na taj i taj cilindar,
> i za vreme dok HD to radi, glavni program radi nesto
> drugo. Kad glave stignu na odrediste HD generise interapt
> i onda mu se nalozi da ucita neki sektor sa tog cilindra,
> ili jos bolje sve sektore sa cilindra ( za odredljenu glavu )
Ovo je tehnika kojom bi se mogla paralelizovati obrada unutar istog
programa sa učitavanjem sa diska. Još bolja specifikacija bi bila
da se podistemu diska specificira adresa u memoriji na koju
će se učitati deo fajla (dakle, da se radi sa većom apstrakcijom
od ove čudne "kada se pomere glave i sl." ) i kada je taj deo fajla
učitan da se nekako javi glavnom programu itd.
Međutim, DOS i BIOS nisu tako pravljeni da ovo podržavaju. Štaviše,
sumnja se da nijedan IDE disk ne može da izvede istu priču. Moguće
je, međutim ovakvu stvar postići ukoliko se ima NT (ni Win95 nije
dovoljan, po (staroj) dokumentaciji koju imam). Takođe, izgleda da ni
na NT-u neće biti stvarne paralelizacije ako mašina nema SCSI diskove.
asembler.81mminovic,
Hi!
Zna li neko da li je moguće realizovati npr. kopiranje nekog .TTF u .EXE
(negde na kraj) ,a onda zatim ako dati .TTF ne postoji na sistemu da bude
stvoren jednostavnim vraćanjem na disk i nazivanjem .TTF?
Ako ima nekih drugih ideja da se reši problem fonta...
Pozdrav,Miroslav.
asembler.82msavkovic,
──────────────────────────────────────────────────── ───── ─── ¨ ── ¨ ˙
▄█▀█▄ ██▀█▄ ▄█▀█▄ ▄█▀█▄ ▄█▀█▄
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ * Computer News
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ * Domaća scena: Profesionalni program za
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ zaštitu softvera
██ ▀▀ ██ ██ ██ ██ ██ ▀▀ ██ ▀▀ * Demo scena
▀▀█▄ ██ ██ ██ ██ ██ ██▀▀ * Intervjui: Hoplite/Orange i Basehead/FM
██Ţ██ ██ ██ ██ ██ ██ ██Ţ██Ů██ * Muzika: Velvet Studio 1.0(demo), TB303,.
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ * Programiranje: Triple-sine 250byte
██ ██ ██▀▀ ██▀██ ██ ██ ██ ██ plazma, Brzo učitavanje PCX
██ ██ ██ ██ ██ ██ ██ ██ ██ * Igre: Wing Commander IV, Rayman,...
██ ██ ██ ██ ██ ██ ██ ██ ██ * Filmovi: Toy story, Mary Reilly,...
▀▀▀ ▀▀ ▀▀ ▀▀ ▀▀▀ ▀▀▀
issue #1 - 386+/VGA/GUS,PCS,DAC,SB -
──────────────────────────────────────────────────── ───── ─── ¨ ── ¨ ˙
U konferenciji Sezamnet, broj poruke 32.313
asembler.83rkramer,
Da li iko zna kako se zove onaj drugi mod turbo-asm-a (jedan je
IDEAL, a drugi?)
TIA, speedy
asembler.84evlad,
-> #83, rkramerY> Da li iko zna kako se zove onaj drugi mod turbo-asm-a (jedan je
Y> IDEAL, a drugi?)
MASM ? valjda beše neka kompatabilnost sa masm 5.x sourcetom ...
asembler.85ivko,
Moze li mi neko reci kako da kontrolisem registre EAX, EBX, ECX
... kod mikroprocesora 80386. Trebju mi kodovi tih komandi i
njihovi parametri.
asembler.86obren,
-> #85, ivko> Moze li mi neko reci kako da kontrolisem registre EAX, EBX, ECX
> ... kod mikroprocesora 80386. Trebju mi kodovi tih komandi i
> njihovi parametri.
Ti registri se koriste ekvivalentno svojim "podregistrima" AX, BX...
Pretpostavljam da si zaboravio da staviš jedno .386 na početku
programa pa je asembler prijavljivao greške?
asembler.87ivko,
U principu je OK mada se nismo najbolje razumeli. Ja nisam rekao
da to necu koristiti iz asemblera vec direktno moram pisati
kodove u memoriju racunara i odatle startovati programcic.
Asembler mi je u mom (pomalo specijalnom) slucaju neupotrebljiv.
HVALA za prethodni odgovor...
asembler.88obren,
-> #87, ivko> U principu je OK mada se nismo najbolje razumeli. Ja nisam rekao
> da to necu koristiti iz asemblera vec direktno moram pisati
> kodove u memoriju racunara i odatle startovati programcic.
> Asembler mi je u mom (pomalo specijalnom) slucaju neupotrebljiv.
> HVALA za prethodni odgovor
Opcodovi svih instrukcija (zaključno sa i486) imaju u Turbo Assembler
Quick Reference Guide-u. Mogu da ti dam da iskopiraš ako se nisi snašao
na drugom mestu...
asembler.89ivko,
-> #88, obrenPosto sam ja u vojsci, kontaktiraj mog burazera (011/444-2698 -
Misa) oko 17h i ostavi svoj broj telefona ili meni na e-mail
posto ovde ne mozes da me zoves a meni su veze slabe za
prebacivanje modemom. Potrebne su mi te stvari posto ovde na
kompjuteru u kasarni nema ama bas nista.
Unapred hvala!
asembler.90biber,
Kako su (fizicki) mapirani particionisani diskovi?
Npr. na disku su dve particije, i disk je prazan.
Ako snimim fajl na drugu particiju, na kom cilindru
ce se fizicki nalaziti fajl:
a) negde pri pocetku diska (oko prvog cilindra)
b) negde na polovini diska
asembler.91nenad,
-> #90, biber> Kako su (fizicki) mapirani particionisani diskovi?
Mapirani su redom po sektorima, shodno logičkoj strukturi diska
(glave, cilindri, sektori). Fizički to ne mora uopšte da odgovara
stvarnosti, većina novih diskova ima najviše jednu do dve ploče.
> Npr. na disku su dve particije, i disk je prazan.
> Ako snimim fajl na drugu particiju, na kom cilindru
> ce se fizicki nalaziti fajl:
> a) negde pri pocetku diska (oko prvog cilindra)
> b) negde na polovini diska
Nalaziće se na delu diska odvojenom za drugu particiju. Šta kojoj
particiji pripada i gde koja počinje i završava definiše se u
particionoj tabeli. Na jednom fizičkom hard-disku može postojati
najviše 4 particije (toliko mesta ima u particionoj tabeli).
Particije mogu biti različitog "tipa" i formatirane na različite
načine, dva najvažnija "tipa" su 'primarna' particija (koja može
biti određena 'aktivnom' i sa nje se može podići sistem) i tzv.
'extended' particija koja u sebi sadrži lokalnu particionu tabelu
i može sadržavati veći broj logičkih particija koji se posle pod
DOS-om vide kao diskovi, recimo e, f, g...
asembler.92dzakic,
-> #137, zvezdan> Nije biber kriv što je njegov program drastično brži u odnosu na
> ostala rešenja. Čovek se ispraksovao na Spectrum-u gde nije ni mogao
> da razmišlja o C-u, a ne kao mnogi koji danas odmah u startu počinju
> da rade sa Visual C++ od 650 MB CD-a.
Nadam se da niko ovde nije ni hteo da kaže da je pobednik 'kriv' što
je radio u asembleru. Mnogi su ispekli zanat na Spektrumima i
Komodorima, sećam se i dan danas nekih adresa koje reaguju na magične
peek & poke :), verujem da pamtite adresu u rom-u procedure za ispis
na ekran ili load i save. Mađutim, ma koliko nam svima asembler bio
drag, viši programski jezici fakat rade isti posao, nešto sporije, ali
sa daleko manje uloženog programerskog vremena. Cela kompjuterska
industrija ide u tom pravcu da se brzinom hardvera nadoknađuje
neefikasnost izvršnog koda. Pamtim rečenicu iz .doc-a jednog korisnog
shareware paketa koja kaže nešto kao: There is considerable overhead
using this method, but... why else developing Pentium ;)
Ipak, tamo gde je brzina kritična, asembler će uvek naći svoju
primenu i uz dobar algoritam iz mašine izvući maksimum. Jedan od
primera je i pobednik upravo završenog takmičenja :)
Pozdrav, Zak
asembler.93biber,
-> #136, dzakic>> konkurenata. Ocigledno je da sledeci put moramo malo "skresati" izbor
>> alata na vise programske jezike, posto nam je primarni cilj bio da
:((
Necete valjda :(
Inace svoje programe uglavnom radim u asembleru (sto znaci da necu
moci vise ucestvovati na takmicenju), pa je tako bilo i sa ovim.
Nisam ga uradio u asm da bih po svaku cenu pobedio.
No dobro. Ako se vec oprastamo od asemblera u zadacima, da iznesem
jedno zanimljivo zapazanje. Asembler za x86 procesore ima veliki
broj instrukcija. Od toga se prakticno koristi relativno mali
broj istih. Izlazi da visak uglavnom sluzi da poskupi i zakomplikuje
izradu procesora (bolje se greje;). Konkretno, moje resenje je
uradjeno sa par osnovnih instrukcija. Bez problema bi se moglo
prepevati i za "anticki" Z80, i ne bi nista "zafalilo".
Da li je buducnost u RISC-u?
asembler.94biber,
-> #91, nenad>> Nalazice se na delu diska odvojenom za drugu particiju. Sta kojoj
>> particiji pripada i gde koja pocinje i zavrsava definise se u
>> particionoj tabeli. Na jednom fizickom hard-disku moze postojati
Postoji li negde opis particione tabele? Nekakav fajl
ili knjiga.
asembler.96zvezdan,
-> #92, dzakic>> viši programski jezici fakat rade isti posao, nešto sporije,
>> ali sa daleko manje uloženog programerskog vremena.
Ovo je stvarno diskutabilno. Ako bi učesnici na takmičenju
bili iskreni da priznaju koliko su vremena uložili u
programiranje ovog zadatka pa da možemo i to da uporedimo.
A da su "nešto sporiji" opovrgao je biberov program.
asembler.97janko,
-> #93, biber
> No dobro. Ako se vec oprastamo od asemblera u zadacima, da
> iznesem
> jedno zanimljivo zapazanje. Asembler za x86 procesore ima
> veliki
> broj instrukcija. Od toga se prakticno koristi relativno mali
> broj istih. Izlazi da visak uglavnom sluzi da poskupi i
> zakomplikuje
> izradu procesora (bolje se greje;). Konkretno, moje resenje je
> uradjeno sa par osnovnih instrukcija. Bez problema bi se moglo
> prepevati i za "anticki" Z80, i ne bi nista "zafalilo".
>
> Da li je buducnost u RISC-u?
Cela priča sa RISC-om (ovde ide crtica jer je RISC skraćenica, inače
se crtice ne pišu kada se strane reči menjaju po padežima što veći
broja autora u Računarima ne zna) je u stvari priča o tzv. localized
cost principu: ako uvedeš neku instrukciju koja usporava dekodovanje
instrukcije, a time i SVE OSTALE instrukcije, a sama se retko koristi,
išao si na pogrešnu stranu.
Osnovna ideja RISC-a je da za odlazak do samoposluge ne treba da
trošiš 500 litara za let helikoptera, a CISC su išli drugačije "da
svedemo sve na letenje, pa da vidimo".
Ali osnovno je ovo: pravi RISC procesori skoro da UKIDAJU potrebu za
ASM programiranjem! Iako imaju "mali" (nije više mali, pogledaj
specifikaciju za PowerPC ili MIPS pa ćeš videti) set isntrukcija,
još više su neugodni za lako programirane nego stariji (CISC
filozofija je olakšati programiranje hardverom!). Današnji dobar C
kompajler će često dati EFIKASNIJI kod nego što će to napisati
asemblerski programer! Zato, vataj se za C(++) što pre!
asembler.98biber,
-> #97, janko>> kompajler ce cesto dati EFIKASNIJI kod nego sto ce to napisati
>> asemblerski programer! Zato, vataj se za C(++) sto pre!
Nema sanse :)
Po meni visi programski jezici su u prednosti kad je u pitanju
ulaz i izlaz podataka. To je velika gnjavaza raditi u asembleru.
Ali neke zahtevne module programa bi svakako trebalo raditi "rucno".
Naravno, pod uslovom da je problem koji resavas zahtevan.
Jedino covek zna (ponekad i intuitivno) kakav je tok programa, dok
kompajler ipak prevodi mehanicki.
Rekao bih da je prevodjenje "zivih" jezika sasvim lepa
analogija ovome.
asembler.99embe,
-> #96, zvezdan>>Ovo je stvarno diskutabilno. Ako bi ucesnici na takmicenju
>>bili iskreni da priznaju koliko su vremena ulozili u
>>programiranje ovog zadatka pa da mozemo i to da uporedimo.
Vreme koje sam ja upotrebio je oko 6 sati. Zadatak sam poceo
da resavam u nedelju, nesto posle 12 , i uz tri cetiri pauze,
zavrsio oko 22:30. Sors sam zakacio tek oko 23:45, jer je bila
guzva na Sezamu. Ova verzija je bila potpuno ispravna i radila je
brzo ali sam ipak sutradan (ponedeljak) napravio minorne izmene
(10 minuta posla) i poslao definitivno resenje. Znaci,
ukupno vreme: 6 sati i 10 minuta :)
>>A da su "nesto sporiji" opovrgao je biberov program.
To da je biberov program brzi 5x od drugoplasiranog i 15x od mog,
cetvrtoplasiranog, proisteklo je iz samog nacina testiranja.
Ne sumnjam u to da je biberov algoritam dobar, ali STVARNA brzina
algoritama nije izmerena. Smatram da je tolika razlika proistekla
iz ogromne razlike u brzinama kod ulazno-izlaznih operacija, na
relaciji asembler - visi programski jezici. Sto se tice OVOG samog
algoritma i ciste numerike, NIKO ne moze da kaze, da je asembler
brzi od C++, Paskala i ostalih jezika. Sve je to isto do u dlaku.
Stvar je u ALGORITMU, a ne u jeziku. Zato, potrebno je naci nacin
za testiranje algoritama a ne ulaza i izlaza. Ne znam asembler,
pa ni ne mogu suditi o finesama u biberovom algoritmu. Ali bez
svake sumnje algoritam je dobar.
Pozdrav, EMBE
asembler.100nenad,
-> #94, biber> Postoji li negde opis particione tabele? Nekakav fajl
> ili knjiga.
Trebalo bi da opis postoji i u ovim programerskim referentnim
priručnicima koji postoje Sezamu (help PC, tech-ref...).
asembler.101tomil,
-> #94, biber> Postoji li negde opis particione tabele? Nekakav fajl
> ili knjiga.
U "Računarima" br.57 (januar/1990.) na strani 68 imaš tekst
"Rekurzivna trka po disku" od autora Vlade Kostića. Tu je između
ostalog opisan i izgled tabele particija.
Možda na Sezamu postoje stari brojevi "Računara" u elektronskom
obliku, (treba proveriti sa redakcijom), a ako ne možeš da nađeš taj
broj, ti viči, pa ću taj deo teksta prekucati.
Uzput, čestitam ti na pobedi na takmičenju, pokazao si kako
programiraju
pravi programeri (pravi programeri, naravno, koriste isključivo
assembler).
Miša.
asembler.102dpredovic,
-> #98, biber> Jedino covek zna (ponekad i intuitivno) kakav je tok programa, dok
> kompajler ipak prevodi mehanicki.
Jeste, ali kod procesora koji znaju da preklapaju instrukcije ako
su zadatate po određenom rasporedu (Pentium+, RISC...) stvarno postaje
pitanje koliko čovek sve to može da isprati. Kada u igru uđe i
višeprocesorski rad, to je već na male goliće...
asembler.103vitez.koja,
-> #101, tomil#=> pravi programeri (pravi programeri, naravno, koriste isključivo
#=> assembler).
Ovo smo apsolvirali odavno. Pravi programeri kucaju
COPY CON: RESENJE.EXE
problem je što galimpic traži neki izvorni kod i šta ti ja znam...
sk
asembler.104biber,
-> #99, embe>> relaciji asembler - visi programski jezici. Sto se tice OVOG samog
>> algoritma i ciste numerike, NIKO ne moze da kaze, da je asembler
>> brzi od C++, Paskala i ostalih jezika. Sve je to isto do u dlaku.
>> Stvar je u ALGORITMU, a ne u jeziku. Zato, potrebno je naci nacin
Svakako, da je najvazniji algoritam, ali i realizacija
algoritma ima udela u brzini izvrsavanja. Takodje i kvalitet
prevodioca. Zbog toga je asembler brzi od visih jezika. Tj.
tacnije bi bilo reci da covek bolje prevodi neki algoritam
u oblik razumljiv procesoru, nego bilo kakav program-prevodioc.
Ako si nekad analizirao neki kompajliran program (disasemblirao
ga) video si da se tu nalazi gomila (na oko) besmislenih naredbi
koje prebacuju vrednosti iz jedne u drugu memorisku lokaciju, pri
tome ukljucujuci gomilu poziva raznoraznih potprograma. Argumenti
se prenose putem steka (dakle ponovo pisanje i citanje iz memorije)
Covek ce sa pak, koristeci asembler, truditi da sto je moguce vise
podataka drzi i prebacuje koristeci registre procesora koji su
neuporedivo brzi od memorije. Pa zatim tu su ostali sitni dobici
(trikovi za deljenje sa 10, proveravanje znaka operacije, "generisanje
nule" i sl.) Sve zajedno kad se skupi izadje da je ipak asembler brzi.
Medjutim ta prednost coveka (asemblera) nece trajati dugo. Kad u
siru upotrebu udju viseprocesorski sistemi, tesko ce covek biti u stanju
da prati izvrsavanje vise paralelnih tokova programa. Tu su prevodioci u
prednosti. Mislim da je i janko nesto slicno mislio u nekoj od
prethodnih poruka.
asembler.105biber,
-> #102, dpredovic>> pitanje koliko covek sve to moze da isprati. Kada u igru ude i
>> viseprocesorski rad, to je vec na male golice...
Evo upravo sam nesto slicno napisao kao odgovor embe-u.
Svakako. Vec sada nisam siguran da bi covek uspeo da napise
program koji paralelno korisiti i procesor i koprocesor
(386+387 pa na dalje). Sa druge strane opet nisam ubedjen ni da
su kompajleri tako dobro napravljeni da prevode programe tako da
razbacaju numericke i ostale instrukcije, kako ne bi procesor i
koprocesor se medjusobno cekali. Za sada mrtva trka. Ali kako
vreme ide verovatno necemo vise ni morati da kuckamo po tastaturama.