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,
)>- 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,
ű>> 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,
> 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,
>> 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,
>> 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,
>+ 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,
>> >> 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,
>> 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,
)>- 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,
)>- 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,
)>->> 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,
> 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,
>> 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,
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,
>> 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,
)-> 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,
)>- 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,
>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,
>Vec si poceo? :)
Ne brini, I am harmless. U svakom slucaju, puno hvala na informacijama.
asembler.26konem,
> 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,
>> Ne znam kako da ti se zahvalim, sem :Thanks,biber....
Napisi neki PD program. U asembleru naravno. :)
asembler.28kriss,
˙˙ 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,
˙˙ formi u PCu i Asmu: TecHELP, HelpPC, ASM - norton guide,
˙˙ asmtutor.zip...
Ovaj zadnji je bar po meni beskoristan i zbunjuje.
asembler.30kriss,
˙˙ 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,
>> 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,
>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,
> Ovo je skoro 100% po knjizi, amda moze i da se optimizuje. Pisao
Kojoj knjizi..?
asembler.34deimos,
>> > 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,
˙˙ 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,
RE: 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,
> 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,
>> 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,
> 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,
> 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,
> 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,
> 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,
> 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,
> 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,
ű>> 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,
>> 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,
˙˙ 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,
> 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,
Konverzija 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,
;;; 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,
> ????????????? 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,
> ????????????? 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,
>> 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,
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,
> 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,
>> 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,
> 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,
> Desni primer radi i nikako da odgonetnem zasto nece levi.
> jnz nema jnz ne_stari
^^^^ a gde ti je ovo?
asembler.73biber,
>>> 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,
>> 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,
Mislim 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,
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,
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,
> 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,
Y> 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,
> 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,
> 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,
Posto 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,
> 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,
> 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,
>> 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,
>> 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,
>> 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,
> 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,
>> 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,
>>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,
> 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,
> 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,
> 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,
#=> 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,
>> 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,
>> 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.
asembler.106janko,
> 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.
To svaki optimizujući kompajler radi bez problema.
> neuporedivo brzi od memorije. Pa zatim tu su ostali sitni
> dobici
> (trikovi za deljenje sa 10, proveravanje znaka operacije,
> "generisanje nule
Sve te trikove zna i svaki dobar kompajler.
Očigledno nisi skoro gledao kakav sors generišu dobri kompajleri.
> Sve zajedno kad se skupi izadje da je ipak
> asembler brzi.
Veoma retko, samo kada se čovek polomi da optimizuje određenu malu
petlju. Većinu koda koji izoptimizuje kompajler ne bi stigli ni svi
Kinezi sveta da izoptimizuju...
asembler.107janko,
Na temu diskusije "da li kompajleri znaju da pišu kao asm programeri":
Evo kako Borland C++ 4.5 prevodi sledecu funkciju (za 32-bitni kod -- ko
još koristi XT ili 286? -- a koliko asm programera zna da piše 386 i
jači kod?):
int mnozi( int a )
{
return a * 31;
}
Prevod je:
_mnozi proc near
;
; int mnozi( int a )
;
push ebp
mov ebp,esp
;
; {
; return a * 31;
;
mov eax,dword ptr [ebp+8]
mov edx,eax
shl eax,5
sub eax,edx
;
; }
;
pop ebp
ret
_mnozi endp
Primetite kako je izvedeno množenje sa 31, tako da se ne radi
pravo MUL. Može li asm programer bolje? Ne.
OK, reći će neko, ali tu je overhead poziv funkcije (na stek--sa steka).
ako se to smatra kritičnim, doda se samo jedna ključna reč u deklaraciji
funkcije:
inline int mnozi( int a )
{
return a * 31;
}
Pogledajmo sad prevod funkcije koja poziva našu "mnozi"
Funkcija:
int sloz( int c )
{
return mnozi( c ) + 33;
}
Prevod:
@sloz$qi proc near
;
; int sloz( int c )
;
push ebp
mov ebp,esp
;
; {
; return mnozi( c ) + 33;
;
mov eax,dword ptr [ebp+8]
mov edx,eax
shl eax,5
sub eax,edx
add eax,33
;
; }
;
pop ebp
ret
@sloz$qi endp
Dakle umesto poziva funkcije, sve je ugrađeno "na mesto".
Da je i sloz() inline, ni za nju ne bi postojao overhead itd...
asembler.108biber,
>> Sve te trikove zna i svaki dobar kompajler.
>>
>> Ocigledno nisi skoro gledao kakav sors generisu dobri kompajleri.
Evo pogledao sam deo koda iz embe.exe
Pazi kako se doturaju argumenti potprogramu (funkciji).
push si ; ovo je argument
call potprogram
.....
.....
potprogram: push bp
mov bp,sp
push si
push di
mov di,w[bp+4]
Posle ovih operacija se u di registru nadje vrednost
ulaznog argumenta funkcije (potprograma), tj. ono sto je
bilo u si pre pozivu potprograma.
Sve zajedno prilicno neefikasno. Pogotovo sto ovakvih
poziva imas na svakih nekoliko linija programa. Takodje
u okviru potprograma imas poziv drugog potprograma a cesto
i nekoliko nivoa poziva.
Obren rece da je program preveden sa BC 3.1 i sa svim
optimizacijama ukljucenim.
Na koji kompajler si ti mislio kad si rekao "optimizujuci" ?
Ajde prevedi embe.cpp sa njim pa mi okaci u mail.
E da, na kraju, vidjao sam programe koji prilikom svakog
poziva potprograma proverevaju jos i da li se stek prepunio.
I to, naravno, tako sto pozovu potprogram koji ce to da
proveri. Tek to je gubitak vremena.
asembler.109embe,
>> optimizacijama ukljucenim.
>> Na koji kompajler si ti mislio kad si rekao "optimizujuci" ?
>> Ajde prevedi embe.cpp sa njim pa mi okaci u mail.
Evo i ja da se ukljucim. Nije stvar u embe.cpp. Program je i
pisan tako da se sastoji od nekoliko kratkih potprograma, umesto
da se sastoji od samo jedne funkcije. O prednostima razlaganja
programa na vise malih funkcija ne bih pricao. Mogao sam, ali
nisam da ovaj program napisem u obliku jedne funkcije ali smatram
da je takav nacin pisanja programa STETAN po kulturu programiranja.
Ni na kraj pameti mi nije bilo da ovo "usitnjavanje" moze dovesti
do bitnog usporenja programa.
BTW, nasi algoritmi su razliciti pa je besmisleno porediti duzinu
asemblerskog koda koji si ti napravio i onog kojeg vidis u debugeru,
a sto se tice pozivanja potprograma, koliko mi se cini, u tvom
algoritmu i nema potprograma i prenosenja argumenata.
>> E da, na kraju, vidjao sam programe koji prilikom svakog
>> poziva potprograma proverevaju jos i da li se stek prepunio.
>> I to, naravno, tako sto pozovu potprogram koji ce to da
>> proveri. Tek to je gubitak vremena.
To sto si ti video je program kompajliran sa opcijom "Check stack
overflow", koji omogucava da se proverava prepunjenost Stack-a,
sto je vrlo korisno u fazi pisanja programa, jer greske u programu
ciji je uzrok prepunjen stack su veoma veoma zametne za otkrivanje
a manifestuju se haoticnim radom programa. U svakom slucaju, konacna
verzija programa se kompajlira sa iskljucenom opcijom za proveru
stack-a. To sto je provera stacka ostala u kodu, greska je zaboravnog
programera a ne kompajlera, jer kompajleri po defaultu imaju ukljucenu
ovu opciju, kao i opciju za debug informacije itd. Ovo naravno pricam
za Borland kompajlere. I jos nesto, program embe.exe je kompajliran
sa BC++ 3.1, a poznato je da je to kompajler star CETIRI godine i
da je od tada mnogo novih verzija izaslo, a razlika se gotovo uvek
ogledala u poboljsanim optimizacijama (izmedju ostalog).
Pozdrav, Milan.
asembler.110biber,
>> mov edx,eax
>> shl eax,5
>> sub eax,edx
Mudro, nema sta. Pretpostavljam da su i neki drugi mnozitelji
uzeti u obzir. Mozda izlazi iz okvira teme, ali da li slicno
razmisljaju i ostali prevodioci ( MS, Watcom )?
Ipak i dalje ostaje ono doturanje parametara preko steka kao
visak. Covek ipak bolje organizuje podatke.
>> -- a koliko asm programera zna da pise 386 i
U principu samo ubacis "E" ispred registra :)
Ja bih pitao "a koliko asm programera postoji"
Evo ova tema je mesecima prazna.
asembler.111janko,
> Mudro, nema sta. Pretpostavljam da su i neki drugi
> mnozitelji
> uzeti u obzir. Mozda izlazi iz okvira teme, ali da li slicno
> razmisljaju i ostali prevodioci ( MS, Watcom )?
Sve što se može uzeti u obzir se uzima u obzir. Moderani kompajleri
nisu džabe tako ogromni -- za neke optimizacije potrebno je izuzetno
mnogo memorije da bi se svi parametri uzeli u obzir -- toliko da ne
postoji čovek koji bi peške uspeo da to izvede (morao bi da piše
po papiru veličine stadiona i da "igra šah" birajući najbolje
kombinacije danima... a to se dogodi između klika na Run i
startovanja programa...
Opet da ti ponovim, sigurno je da SVE što ti umeš da izvedeš ume i
kompajler.
> Ipak i dalje ostaje ono doturanje parametara preko steka kao
> visak. Covek ipak bolje organizuje podatke.
Malo sutra, višak.
Prokazao sam ti šta možeš da izvedeš u C++ -- da potpuno eliminišeš
poziv funkcije. U Asmu to možeš, ako praviš makroe. Ali znaš koliko
treba truda da umesto duže funkcije napišeš dug makro, i da vodiš
računa o tome da makro i sam brlja registre. Ako ga napišeš sa
push/pops obezbedio si ga, ali on je neefikasniji od kompajlerovog
posla jer kompajler ZNA za svaki ekvivalent makro substitucije koji
su registri angažovani i čime su popunjeni. To nijedan asembler ne
zna, niti je moguće napisati takav makro. Znači ako ti se neki
konstrukt pojavljuje na deset mesta morao bi na svakom RUČNO da ga
pišeš i da bi opitmizovao upotrebu registara. Na C++ napišeš JEDNU
funkciju na JEDNOM mestu, a kompajler sve optimizuje i direktno
ugradi u kod kao da si ti to radio danima...
A upotreba tzv. stek frejmova u "klasičnim" funckijama ti daje
slobode koje su nezamenljive. aKo ti bilo koja od njih zatreba u ASM
programu, i tebi je najefikasniji način da koristiš stek-frejm.
asembler.112janko,
> >> -- a koliko asm programera zna da pise 386 i
>
> U principu samo ubacis "E" ispred registra :)
Ajde da ti dam program koji si pisao za 8086 i rekao ti "hoću da
koristi 386 instrukcije". Koliko ćeš ga menjati? Za moj C++ sors,
samo prevedem drugim kompajlerom.
> Ja bih pitao "a koliko asm programera postoji"
> Evo ova tema je mesecima prazna.
Ja sam asm programer, kada treba. ;) Ali treba samo u vrlo retkim
situacijama. C i C++ mogu puno toga. Ja sam sa BC pisao .COM programe
koji su imali samo po tridesetak bajtova, npr.
asembler.113biber,
>> BTW, nasi algoritmi su razliciti pa je besmisleno porediti duzinu
>> asemblerskog koda koji si ti napravio i onog kojeg vidis u debugeru,
Mislim da nisi razumeo o cemu janko i ja pricamo. Nije o duzini
koda nego o optimizaciji.
>> a sto se tice pozivanja potprograma, koliko mi se cini, u tvom
>> algoritmu i nema potprograma i prenosenja argumenata.
Ne secam se, ali nije ni bitno. Kad bi ih bilo sigurno ne bih
nekoliko puta gurao i skupljao podatke sa steka kao sto rade
kompajleri. Ovo je samo jedan najocigledniji primer kako
kompajler ipak losije radi od coveka. Ako malo vise zaceprkas
po kodu nekog programa (tvoj je eto slucajno uzet za primer,
mogao sam da analiziram i vinkov ili mhrkicev ili ...) videces
da su i podaci organizovani na..., pa za coveka na cudan nacin.
Npr. instrukcija mov [bx+di+14] trosi vise vremena od mov [bx]
a ipak kompajleri teze prvoj varijanti. Jednostavno zato sto
prevode mehanicki.
>> stack-a. To sto je provera stacka ostala u kodu, greska je zaboravnog
>> programera a ne kompajlera, jer kompajleri po defaultu imaju ukljucenu
:)) Sem provere, zaboravio je i labele, pa sam sa uzivanjem
mogao da analiziram program.
asembler.114janko,
Hajde gospodo asemblerski programeri, pogodite i kako se
radi mnozenje sa 10 nekog broja u eax na BC 4.5, ali
da ne gledate u resenje (citaj kompajlirate njime).
Resenje sutra.
asembler.115bceklic,
> Ja bih pitao "a koliko asm programera postoji"
> Evo ova tema je mesecima prazna.
Imam iza sebe par mega asm sourceta sto me pretpostavljam
stavlja u ovu grupu :) Nekada sam sve poslove radio u asm-u (lude
godine..) ali u zadnje vreme pokusavam da upotrebu asm-a smanjim na
minimum. Tako asm upotrebljavam samo kada je kriticna brzina
izvrsavanja, oko poslova zastite softvera i antivirusne zastite.
Za vecinu poslova koristim c/c++ a ako je u pitanju neka 'brza'
aplikacija za rad sa bazama tu je naravno clipper ;).
Povodom diskusije o optimizacijima koje nude danasnji kompajleri
i opravdanosti koriscenja asm-a...
I sam sam proveo izvesno vreme proucavajuci kod koji generisu
neki od c kompajlera. Iako sam bio zadrti asm programer moram da
priznam da danas ipak prihvatam cenu nesto sporijeg izvrsavanja na
racun brze izrade, lakseg odrzavanja i portabilnosti.
poz, Blagoje.
asembler.116obren,
> Ne secam se, ali nije ni bitno. Kad bi ih bilo sigurno ne bih
> nekoliko puta gurao i skupljao podatke sa steka kao sto rade
> kompajleri. Ovo je samo jedan najocigledniji primer kako
> kompajler ipak losije radi od coveka.
Takozvani "stack frame" je opšteprihvaćen način prenosa podataka i
neophodan je ako se želi povezivanje .OBJ datoteka pisanih u različitim
jezicima. Druga prednost je za "reuse" podprograma: ti možeš napisati u
C-u neku funkciju, prevesti je i povezati u LIB koji ćeš kasnije
pozivati iz svojih programa i to će ˙sigurno˙ raditi.
Ako ručno optimizuješ prenos parametara u ASM-u to radiš zavisno od
situacije za koju ti treba. Verovatno ćeš postići spektakularne
rezultate u konkretnom slučaju, ali je "reupotrebljivost" ;) te
procedure vrlo mala. Pitanje je da li ćeš u nekom novom programu koji
budeš pisao imati baš iste registe slobodne za prenos parametara i kakve
ćeš kompromise morati da praviš da bi koristio "staru" funkciju.
Kad smo već kod ovoga, kod C-a postoji i "fastcall" način prosleđivanja
parametara, koji ne koristi STACK FRAME već argumente smešta u slobodne
registre. Problem kod PC-a je što "slobodnih" registara nikad nema na
pretek (kod Borlanda su to, čini mi se, AX, BX i DX).
asembler.117janko,
> Hajde gospodo asemblerski programeri, pogodite i kako se
> radi mnozenje sa 10 nekog broja u eax na BC 4.5, ali
> da ne gledate u resenje (citaj kompajlirate njime).
>
> Resenje sutra.
add eax,eax
lea eax,dword ptr [eax+4*eax]
asembler.118janko,
> Takozvani "stack frame" je opšteprihvaćen način prenosa podataka i
> neophodan je ako se želi povezivanje .OBJ datoteka pisanih u
> različitim jezicima. Druga prednost je za "reuse" podprograma: ti
> možeš napisati u C-u neku funkciju, prevesti je i povezati u LIB
> koji ćeš kasnije pozivati iz svojih programa i to će ˙sigurno˙
> raditi.
Zapravo, ne!
Stek frejm je mehanizam koji obezbeđuje REKURZIJU. Kada se funkcija
prevede tako da održava stek frejm, garantovano će biti REENTRANT.
Istorijski, stariji kompajleri nisu imali stek frejm -- FORTRAN npr.
Zato FORTRAN procedure nisu reentrant.
Za povezivanja OBJ nastalih različitim kompajlerima stek frejm kao
takav je nebitan, linker to uopšte ne proverava, a još su prvi C
kompajleri mogli da pozivaju fortranske procedure.
asembler.119embe,
>> Mislim da nisi razumeo o cemu janko i ja pricamo. Nije o duzini
>> koda nego o optimizaciji.
Ma znam ja o cemu pricate. Ako je putanja izvrsavanja programa ista
najnormalnije je da se brze izvodi program sa manje linija. O tome
sam JA pricao.
asembler.120biber,
>> Ajde da ti dam program koji si pisao za 8086 i rekao ti "hocu da
>> koristi 386 instrukcije". Koliko ces ga menjati? Za moj C++ sors,
>> samo prevedem drugim kompajlerom.
Slazem se naravno da su visi programski jezici mnogo fleksbilniji.
Svakako nije bez razloga sto se vecina programera okrece C-u.
asembler.121janko,
> add eax,eax
> lea eax,dword ptr [eax+4*eax]
Ovo sam namerno ostavio kao primer jer ilustruje netačnost
tvrdnje da je "programiranje za 386 i jače isto što i za 86
samo se dodaje e". Ovde su demonstrirane značajno veće mogućnosti
adresnih modova u odnosu na starinski kod.
asembler.122obren,
> Zapravo, ne!
> Stek frejm je mehanizam koji obezbeđuje REKURZIJU. Kada se funkcija
> prevede tako da održava stek frejm, garantovano će biti REENTRANT.
Ma ok... nije u tome bila poenta. U principu je bitno samo kojim
redosledom gurneš parametre pre poziva, a funkcija može da ih kupi
kako zna i ume, ne mora biti klasičan stack frame. Međutim, ako
pogledaš uputstvo za Turbo Assembler (povezivanju sa drugim jezicima)
videćeš da je prvo objašnjen stack frame kao standardan mehanizam za
prenos parametara među različitim jezicima. Naravno da linker ne
proverava prilikom povezivanja, jer je to u principu deo programa
u čiji sadržaj on ne ulazi... :)
Replicirao sam o razlozima zašto C onako "glupo" prenosi parametre
u odnosu na način kako bi to neko uradio u asmebleru...
asembler.123janko,
> Replicirao sam o razlozima zašto C onako "glupo" prenosi parametre
> u odnosu na način kako bi to neko uradio u asmebleru...
I odgovor je zato da bi podržao rekurzivnost i reentrablinost
funkcija. To je jedini razlog za postojanje stek frejma. Ako se to
ne želi, stvarno postoje drugačiji mehanizmi prenosa parametara.
Dokaz -- Fortran.
asembler.124janko,
> Međutim, ako
> pogledaš uputstvo za Turbo Assembler (povezivanju sa drugim
> jezicima)
> videćeš da je prvo objašnjen stack frame kao standardan mehanizam za
> prenos parametara među različitim jezicima.
Ne, uputstvo upravo objašnjava kako KONKRETNI kompajleri organizuju
poziv funckija, i to zato da bi ti mogao da napišeš funkciju i poziv
imitirajući kompajlerov stil.
Da to nije nikakav standard trebalo bi da ti je očigledno: već Turbo
Paskali i turbo C, oba od istog proizvođača, neće po defaultu
generisati pozive funkcija i same funkcije na isti način.
To čak ima uzroke i u definiciji ponašanja jezika: u SVAKOM C-u
funckija nije nadležna za uklanjanje dostavljenih parametara, a u
svakom Paskalu jeste. To je suštinska razlika, a proističe iz
činjenice da se Paskal i C sorsovi prevode pod različitim
pretpostavkama. (Ne čačkaj me na ovu temu, to je oblast kojom se
bavim profesionalno).
asembler.125obren,
Da ne repliciram odvojeno na tvoje poruke, sastavio sam citate iz obe:
> I odgovor je zato da bi podržao rekurzivnost i reentrablinost
> funkcija. To je jedini razlog za postojanje stek frejma. Ako se to ne
> želi, stvarno postoje drugačiji mehanizmi prenosa parametara.
> Dokaz -- Fortran.
Da podržava gnežđenje, apsolutno se slažem (nisam nikad ni tvrdio
suprotno), da postoje drugačiji načini prenosa parametara takođe, ali
pitanje je da li ih iko koristi? ;) Ništa nije Bogom dano, ali neke
stvari su opšte prihvaćene iako nisu propisane standardom...
Ok, ajde ako imaš pri ruci, napiši kako prenosi parametre taj Fortran
koji ne koristi stek frejm?
> Da to nije nikakav standard trebalo bi da ti je očigledno: već Turbo
> Paskali i turbo C, oba od istog proizvođača, neće po defaultu
> generisati pozive funkcija i same funkcije na isti način.
Što se tiče tvrdnje da stack frame nije nikakav standard, mislim da
grešiš. Počevši od i80186 postoje i mašinske instrukcije koje ga
formiraju (ENTER/LEAVE). Ne bi ih trpali u mikrokod da nisu videli da
svi to rade na isti način. Svi kompajleri koji su mi došli pod ruku (tu
spada i nekoliko Fortrana) standardno koriste za prenos parametara stek,
a na ulazu u funkciju formiraju frejm na isti način:
PUSH BP
MOV BP, SP
SUB SP, nnn ; količina prostora za lokalne promenljive
; neki Fortrani (!) mogu i da sračunaju nnn,
; slično onom što se pominje u novom standardu C-a
...
(dohvatanje parametara relativno od BP-a. ofseti su različiti)
(u zavisnosti od redosleda stavljanja parametara na stek)
...
RET [nnn] ; [nnn] u slučaju Paskala
> To čak ima uzroke i u definiciji ponašanja jezika: u SVAKOM C-u
> funkcija nije nadležna za uklanjanje dostavljenih parametara, a u
> svakom Paskalu jeste. To je suštinska razlika, a proističe iz
> činjenice da se Paskal i C sorsovi prevode pod različitim
> pretpostavkama.
Veruj mi - zaista znam o čemu govoriš, ali kao što rekoh jedina razlika
je u displejsmentu u odnosu na BP i u tome ko skida parametre. A sve
zajdeno postoje dve varijante. Ja bar ne videh druge, a i te dve
varijante su STANDARDNE i nazivaju se Pascal i C calling convention.
> (Ne čačkaj me na ovu temu, to je oblast kojom se bavim profesionalno).
Pa super, to je razlog više da te čačkam! :) Uvek sam raspoložen da
nešto naučim od iskusnijeg kolege. Nadam se samo da ne gušimo ostale?
asembler.126janko,
> Da podržava gnežđenje, apsolutno se slažem (nisam nikad ni tvrdio
> suprotno), da postoje drugačiji načini prenosa parametara takođe,
> ali pitanje je da li ih iko koristi? ;) Ništa nije Bogom dano, ali
> neke stvari su opšte prihvaćene iako nisu propisane standardom...
Ali to sve nema veze sa linkovanjem a pogotovu ne sa povezivanjem
koda iz više jezika!
> Ok, ajde ako imaš pri ruci, napiši kako prenosi parametre taj
> Fortran koji ne koristi stek frejm?
Standardni Fortrani (dakle oni kod kojih je rekurzija nemoguća!)
su jednostavno statički alocirali promenljive za procedure. U doba
sporijih mašina postojale su i varijante drugih jezika (Paskala, čak!
čini mi se da je i Turbo Paskal to radio) koji su po defaultu tako
prenosili parametre (kroz "lokalne" statičke promenljive) a tek po
uključenju posebnog sviča ili ključne reči u definiciji podržavali
rekurziju.
> Što se tiče tvrdnje da stack frame nije nikakav standard, mislim da
> grešiš. Počevši od i80186 postoje i mašinske instrukcije koje ga
> formiraju (ENTER/LEAVE). Ne bi ih trpali u mikrokod da nisu videli
> da svi to rade na isti način. Svi kompajleri koji su mi došli pod
> ruku (tu spada i nekoliko Fortrana) standardno koriste za prenos
> parametara stek, a na ulazu u funkciju formiraju frejm na isti
> način:
Vidi, odavno se ispostavilo da je to toliko korisno da je sasvim
normalno da se koristi. Međutim da se koristi UVEK ISTO to nikad nije
bilo. To što dva jezika koriste stek frejm ne znači da će i raditi
zajedno.
ENTER i LEAVE su poslednji trzaji CISC filozofije: pravi nove naredbe
umesto da si potrošio to malo vremena i napravio ceo procesor malo brže ;)
Te dve citirane "iste instrukcije" su iste prosto jer je to najbrži
skup istrukcija za taj posao. :) Stek frejmovi i pored toga ne znači
da su isti. Već i sama promena nadležnosti njegovog uništavanja utiče
na to da nisu isti i da se ne mogu povezivati.
> > To čak ima uzroke i u definiciji ponašanja jezika: u SVAKOM C-u
> > funkcija nije nadležna za uklanjanje dostavljenih parametara, a u
> > svakom Paskalu jeste. To je suštinska razlika, a proističe iz
> > činjenice da se Paskal i C sorsovi prevode pod različitim
> > pretpostavkama.
>
> Veruj mi - zaista znam o čemu govoriš, ali kao što rekoh jedina
> razlika je u displejsmentu u odnosu na BP i u tome ko skida
> parametre. A sve zajdeno postoje dve varijante. Ja bar ne videh
> druge, a i te dve varijante su STANDARDNE i nazivaju se Pascal i C
> calling convention.
Naprotiv. Evo ti malo kontraprimera:
1. prevedi f-ju C-om, u small modelu
2. prevedi drugu f-ju C-om, u large modelu, koja poziva prvu
3. linkovanje prolazi bez greške. Da li rade?
4. Napravi varijacije u K&R stilu C-a (nemoj da dozvoliš da ti
definiciju jedne f-je vidi druga). Da li rade.
Odgovor je ne, jer svaki model generiše različite stek frejmove po
definiciji (različite veličine elemenata stek frejma). Linker ti se
po pravilu ne buni.
Ono zbog čega ti frejmovi liče je samo zato što su SVI
proizvošači C kompajlera sebe usklađivali sa MS. Ništa više. Ono što
ti zoveš standardnom _pascal konvencijom je samo način na koji je MS
koristio prenos parametara od početka Windowsa (jeste, sva ekranska
okruženja su izvorno bila zamišljena za Paskal a ne za C, Mekintoš
je dobrim delom i razvijan uz pomoć ObjektPaskala).
I da ne davim dalje... Za više ćeš morati negde da me nađeš i podmitiš
pivom da pričam šire :)
asembler.127pedjak,
> pretpostavkama. (Ne čačkaj me na ovu temu, to je oblast kojom se
> bavim profesionalno).
Slobodno se raspiši, i mene zanima.
asembler.128dpredovic,
> Da podržava gnežđenje, apsolutno se slažem (nisam nikad ni tvrdio
> suprotno), da postoje drugačiji načini prenosa parametara takođe, ali
> pitanje je da li ih iko koristi? ;) Ništa nije Bogom dano, ali neke
Pazi, stvar je kompajlera kako će se prenos interno realizovati.
Borlandovi kompajleri (kao) imaju neku fastcall konvenciju koja
ponekad poneki parametar ne gura kroz stack. MSC je već pametniji
pa kod njega (manje-više) svaka funkcija sa 1-2 parametra ode kroz
registre. Kod Watcoma je to default tj. fastcall ne samo da važi za
tvoje nego i za sve standardne funkcije.
asembler.129nenad,
> Opet da ti ponovim, sigurno je da SVE što ti umeš da izvedeš ume i
> kompajler.
Eh, da je tako ne bi postojali kompajleri koji bolje i lošije
optimizuju... Sve to što kompajler ume da izvede je smislio
čovek, nije nemoguća situacija da neko ume ponešto bolje da
izvede od Borlandovih i Microsoft-ovih programera - čak naprotiv. ;)
Jasno je naravno da je za 99% primena bolje posao optimizacije
poveriti ljudima kojima je to posao i koji to rade ceo život.
asembler.130biber,
Zna li ko sta se desava kad, dok tece DMA prenos procesor u isto
vreme pokusa da pristupi memoriji. Ko ceka DMA ili procesor? Da li se
generise neki interapt pri tome?
asembler.131obren,
> Zna li ko sta se desava kad, dok tece DMA prenos procesor u isto
> vreme pokusa da pristupi memoriji. Ko ceka DMA ili procesor? Da li
> se generise neki interapt pri tome?
Zavisi da li je "burst" režim prenosa ili ne. Ako jeste, procesor mora
da sačeka da se ceo blok prenese, a ako nije DMA za svaki bajt traži
dozvolu za izlazak ba magistralu i može da izađe na istu tek kada mu
procesor dozvoli. Interapt se generiše po završetku transfera. Ako ti
treba dokumentacije od DMA imam nekih .DOC i .TXT fajlova, uglavnom
vezanih za korišćenje DMA za "sviranje" na SB-u.
asembler.132pdeze,
Pozdrav!
Nov sam u Assembleru, pa jos nisam skontao neke stvari:
procitao sam negde da na memorijski ofset, npr 1234, u data
segment mogu upisati recimo BX registar na sledeci nacin:
mov [1234], BX
ali mi TASM uporno javlja gresku: Illegal immediate,
mada ovo radi OK u Debuggeru.
Gde je greska, kako ispraviti, ili ako ovako ne moze, koji je drugi
nacin?
Thanks unapred.
asembler.133zormi,
* Zna li ko sta se desava kad, dok tece DMA prenos procesor u isto
* vreme pokusa da pristupi memoriji. Ko ceka DMA ili procesor? Da li se
* generise neki interapt pri tome?
Ima više modova DMA prenosa, zavisi koji se koristi...
asembler.134deimos,
>> mov [1234], BX
Dakle, ono sto upisujes je u bx. Za primer cemo da ga stavimo u ax.
mov dx, <segment>
mov es, dx
mov di,1234
stosw // na ES:DI upisujes word iz ax
Prvo push-ujes , a na kraju pop-ujes regisatre.
Ovo ti sigurno radi. Sto bi se reklo - po knjizi je. Moze i na
milion boljih (kracih) nacina, ali posto ucis, eto ti jedna mini-lekcija.
.dEiMoS.
asembler.135obren,
> Nov sam u Assembleru, pa jos nisam skontao neke stvari:
> procitao sam negde da na memorijski ofset, npr 1234, u data
> segment mogu upisati recimo BX registar na sledeci nacin:
> mov [1234], BX
> ali mi TASM uporno javlja gresku: Illegal immediate,
Stavi:
MOV DS:[1234], BX
(u IDEAL modu će proći i bez DS...)
Pošto si, kako kažeš, nov u ASM-u, ostavi za početak tešku artiljeriju
i uzmi "A86" (Shareware asembler, ima ga ovde u nekom direktorijumu).
Munjevit je, automatski pravi .COM fajlove, što znači da ne moraš uopšte
da pozivaš linker, a ne moraš ni da deklarišeš segmente i ostale
šablonske delove programa. Ima detaljno uputstvo i vrlo je zgodan za
eksperimentisanje...
asembler.136cozymc,
Nista posebno, tek toliko da se i ja pridruzim, najboljem delu sezamNET,
tj ASM, CODINGS, and ZERO LEVEL STUFF. Full frame or lame!
scroll.exeasembler.137biber,
>> Nov sam u Assembleru, pa jos nisam skontao neke stvari:
>> procitao sam negde da na memorijski ofset, npr 1234, u data
>> segment mogu upisati recimo BX registar na sledeci nacin:
>> mov [1234], BX
Za pocetak ( a i na dalje, sto da ne) probaj da radis sa A86
asemblerom. Kod njega bi ovo proslo bez problema. Ukoliko na
pocetku nemas deklaraciju segmenata, A86 podrazumeva da je
u pitanju ".com" program i tako ga prevodi. Brz je, kratak,
lepo te obavestava o greskama a u paketu sa njim ide sasvim
upotrebljiv debager (real mode doduse). Meni se mnogo vise
svidja nego masm ili tasm.
asembler.138biber,
>> uzmi "A86" (Shareware asembler, ima ga ovde u nekom direktorijumu).
Ima li ko A386 i D386 ?
asembler.139deimos,
>> Ima li ko A386 i D386 ?
Treba i meni. So, ako ga nadjes baci ga ovdi, plizzz.
.dEiMoS.
asembler.140biber,
U biosu postoje funkcije za direktno citanje sektora HD-a.
Da li i windows ima slicne fn.?
U nekom spisku kernel funkcija sam pronasao sam samo citanje
fajla. Da li windows ne podrzava pristup sektorima? Je li moguce
tako nesto isprogramirati?
asembler.141janko,
> U biosu postoje funkcije za direktno citanje sektora HD-a.
> Da li i windows ima slicne fn.?
>
> U nekom spisku kernel funkcija sam pronasao sam samo citanje
> fajla. Da li windows ne podrzava pristup sektorima? Je li moguce
> tako nesto isprogramirati?
Windows 3.1 dozvoljava zvanje čistih DOS funkcija, pa je verovatno
moguće i tako nešto, uz malo žongliranja. Međutim ukoliko je 32disk
access sve to je vrlo opasno (pa možda i tada zabranjeno). Tada se
mora komunicirati na nivou viruelnog drajvera.
Win32 interfejs, međutim, koliko znam, ne dozvoljava ovako
nešto na API nivou. Međutim, verovatno bi se to takođe moglo postiči
pisanjem koda kojume da komunicira sa virtuelnim drajverom (kada je
reč o W95, NT ni tada?)
Dokaz za ovakvu teoriju je što za Win95 postoji disk defragmenter!
Za NT, opet, koliko ja znam, ne.
asembler.142biber,
>> moguce i tako nesto, uz malo zongliranja. Medutim ukoliko je 32disk
>> access sve to je vrlo opasno (pa mozda i tada zabranjeno). Tada se
Malo mi je nejasno zasto se ovo zove 32bit access?
Ako ne gresim, kad je 32bit disk acces omogucen, windows za
komunikaciju koristi sopstvene funkcije, a ne svicuje se stalno
u real mod da bi pozivao bios rutine. E sad, li su te windows
funkcije pisane u 32bitnom kodu pa se zato zove 32 bitni acess?
asembler.143deimos,
RE: 32BDA
Stvar se svodi na to da se koristi INSD umesto INSW i slicnih
stvari. Kod nekih novijih bios-a ovo ne donosi poboljsanja (ili bar ne
znacajna), jer isti rade bas na takav nacin.
.dEiMoS.
asembler.144janko,
> Malo mi je nejasno zasto se ovo zove 32bit access?
>
> Ako ne gresim, kad je 32bit disk acces omogucen, windows za
> komunikaciju koristi sopstvene funkcije, a ne svicuje se stalno
> u real mod da bi pozivao bios rutine.
Tačno!
> E sad, li su te windows
> funkcije pisane u 32bitnom kodu pa se zato zove 32 bitni acess?
Vidi, nije bitno ono što kaže deimos da li će ćapiti WORD ili DWORD.
Poenta je samo u tome što pri obraćanju diska procesor ne mora da
izlazi iz svog 32-bitnog režima što je najviše time-consuming.
Glabni trik je u tome što te njegove sopstvene funkcije mogu biti
napisane kao REENTRANT, dok ove BIOS-ove NISU SIGURNO. U situaciji
kada se radi sa više taskova odjednom, pristupi disku treba da budu
što je moguće više preklopljeni itd.
asembler.145nenad,
> Dokaz za ovakvu teoriju je što za Win95 postoji disk defragmenter!
> Za NT, opet, koliko ja znam, ne.
Postoji defragmenter za NT-a, zove se DisKeeper. Pri instalaciji
između ostalog zameni i fajlove NFTS.SYS i NTOSKRNL.EXE svojim
verzijama. Na taj način radi na niskom novou.
Postoji i drugi pristup, koji je primenjen kod nekoliko
defragmentera za OS/2-ov HPFS. Pošto HPFS sam obezbeđuje (ukoliko
je to moguće) da se fajl snimi na disk kontinualno oni praktično
kopiraju fajlove tamo-amo po disku po nekom redu koji misle da će
biti najzgodniji samom HPFS-u da sredi stvar. Verujem da postoje
takvi utility programi i za NTFS.
asembler.146biber,
>> Dokaz za ovakvu teoriju je sto za Win95 postoji disk defragmenter!
Postoji li disk defragmenter za win 3.xx?
asembler.147zeljkoj,
> Postoji li disk defragmenter za win 3.xx?
Da. Recimo onaj iz NU.
asembler.148bokir,
Da li neko moze da ostavi primer za INT 9 hendler?
Pokusavao sam da napravim pop-up TSR, ali mi INT 9 nikako ne
radi.
Cak ni ako stavim samo praznu funkciju (samo IRET), tastatura se
ponasa cudno: svaki pritisak na taster bar tri puta ponavlja
znak.
Pomozite, hitno mi je...
... Only dead Windows is good Windows
asembler.149biber,
>>Da li neko moze da ostavi primer za INT 9 hendler?
>>Pokusavao sam da napravim pop-up TSR, ali mi INT 9 nikako ne radi.
; Demonstracija INT 09 07.07.96
; Pritiskom na F12 na ekran ce biti ispisano slovo "B"
; Pisano za rad sa A86 asemblerom
jmp beg
make_code equ 058 ; make code tastera F12
; MAKE CODE je kod koji se dobija prilikom
; pritiskanja, za razliku od BREAK CODE
; koji signalizira otpustanje tastera
old_int09: dw 0,0 ; ovde se cuva sadrzaj starog int 09
new_int09: push ax
push bx
push ds
in al,060
cmp al,make_code
je jeste_trazeni_kod
nazad: pop ds
pop bx
pop ax
cs:
jmp d[old_int09]
jeste_trazeni_kod:
in al,061
mov ah,al
or al,080
out 061,al
mov al,ah
out 061,al
mov al,020
out 020,al
mov ax,0b800 ;
mov ds,ax ; stavi na ekran
mov bx,09e ; slovo "B"
mov [bx],08242 ; (u gornji desni ugao)
pop ds
pop bx
pop ax
iret
beg: mov ax,03500+09 ; Get Interrupt Vector
int 021
mov [old_int09],bx
mov [old_int09+2],es
mov ax,02500+09 ; Set Interrupt Vector
mov dx,new_int09
int 021
mov dx,beg ; Terminate & Stay Resident
int 027
asembler.150bokir,
Hvala na pomoci, biber! Ovo sjajno radi!
Imam jos par pitanja:
1. Za sta je port 20h?
2. Kako da se program instalira u HMA ili UMB?
asembler.151dzakic,
> 1. Za sta je port 20h?
Port 20h je port interapt kontrolera. Po sećanju, preko njega se
programira frekvencija interapta 8 (ako nije baš 20h, tu je blizu :),
a ono za šta se najčešće koristi jeste da se upisivanjem vrednosti
20h na port 20h vrši signalizacija interapt kontroleru da je završena
obrada interapta i da je PIC (programable interrupt controler)
slobodan da generiše sledeći interapt po prioritetu.
Na primeru, pišeš interapt rutinu za obradu int 8. Za vreme
izvršavanja tvog handlera, pritisnut je taster na tastaturi. Za obradu
interapta tastature je zadužen int 9. On je niži po prioritetu od
osmice i pritisak na taster neće prekinuti izvršavanja tvog int
handlera. Ako tvoj handler ne bi izvršio jedno out 20h,20h, int
tastature nikada ne bi bio izvršen. Zato se ovaj out stavlja na kraj
tvoje procedure i tog trenutka PIC generiše int 9.
Treba takođe voditi računa da će, ukoliko se prvo poziva originalni int
8 (iz biosa), out 20h, 20h već biti izvršen. Zato, ako ima potrebe,
neke stvari treba uraditi pre a neke posle poziva originalne int
rutine.
Detaljnije o ovome možeš da nađeš u HELPPC-u (ima ga u nekom info
direktorijumu), pored drugih jako korisnih informacija o hardveru.
> 2. Kako da se program instalira u HMA ili UMB?
Ovo je malo teže odgovoriti ovako online, ukratko: postoji int kojim
se proverava prisustvo XMS managera (2Fh ako se ne varam). Ako ga
nađe, on vrati pointer na entry u XMS manager koji nudi funkcije tipa
alociranje i dealociranje UMB-a i HMA. Alociraš blok određene veličine
u gornjoj memoriji, dobiješ pointer na dodeljen blok, iskopiraš svoj
kod na to mesto i postaviš int vektore da ukazuju tamo. Da ti, opet,
preporučim da skineš ovog puta techelp koji je za razliku od helppc-a
bolji i detaljniji za ove softverske stvarčice.
asembler.152biber,
Je li neko radio sa windows disasemblerom? (ima ga u
sezamovim direktorijumima)
asembler.153zeljkoj,
> Je li neko radio sa windows disasemblerom? (ima ga u
> sezamovim direktorijumima)
Kad već pomenu Windows ovde... Kako se uopšte pišu Windows programi u
asembleru? Jel' mnogo komplikovanije nego pisanje DOS programa?
Znam da sada, u vreme VB-a, Delphija, itd. nema smisla raditi u asembleru,
pitam čisto onako, 'teorijski'. :)
asembler.154janko,
> > Je li neko radio sa windows disasemblerom? (ima ga u
> > sezamovim direktorijumima)
>
> Kad već pomenu Windows ovde... Kako se uopšte pišu Windows programi
> u asembleru? Jel' mnogo komplikovanije nego pisanje DOS programa?
> Znam da sada, u vreme VB-a, Delphija, itd. nema smisla raditi u
> asembleru, pitam čisto onako, 'teorijski'. :)
Tja... Windows 16-bit programi su malo dosadniji, jer moraš da paziš
na sve one glupe segmente. 32-bitni su malo pristojniji.
Ko zna da piše windows programe na C-u, i zna dobro asembler,
automatski zna da piše i Windows programe na asembleru. I teško je
skoro jednako, što se Windowsa tiče, jer je API isti i za C i za
asembler.
asembler.155janko,
> Ko zna da piše windows programe na C-u, i zna dobro asembler,
> automatski zna da piše i Windows programe na asembleru. I teško je
> skoro jednako, što se Windowsa tiče, jer je API isti i za C i za
> asembler.
zaboravih da napišem moju omiljenu važnu tvrdnju: pomoću C-a
je najlakše pisati asemblerske programe. ;) To mogu
i dokazati -- umem da pomoću C-a napišem .COM program od par desetina
bajtova KOJI RADI NEŠTO KORISNO
, ili rezidentni program koji radi složenu obradu a velik je
par stotina bajtova itd...
asembler.156kovacevicd,
Da li neko zna kojim OUT instrukcijama mogu poslati vrednosti
SB-Pro da na izlazu DAC dobijem napon na određeni kanal levi ili
desni kao i kojim INP instrukcijama da dobijem vrednost napona
sa ADC konvertora. Inače hteo bih primere bez korišćenja DMA
a hteo bih da iskoristim muzičku karticu za merenja u elektronici
jer ima 2 x 16 bit ADC i DAC.
asembler.157biber,
>> zaboravih da napisem moju omiljenu vaznu tvrdnju: pomocu C-a
>> je najlakse pisati asemblerske programe. ;) To mogu
>> i dokazati -- umem da pomocu C-a napisem .COM program od par desetina
void pisi_B (void)
{
asm mov ax,0xe66
asm mov bx,7
asm int 16
}
Jel' mislis na nesto ovako ;>
asembler.158biber,
>> Da li neko zna kojim OUT instrukcijama mogu poslati vrednosti
>> SB-Pro da na izlazu DAC dobijem napon na odredeni kanal levi ili
Evo ti uz poruku fajl koji opisuje kako.
>> a hteo bih da iskoristim muzicku karticu za merenja u elektronici
>> jer ima 2 x 16 bit ADC i DAC.
SB-pro ima 8-bitne pretvarace.
sb_dsp.zipasembler.159janko,
> void pisi_B (void)
> {
> asm mov ax,0xe66
> asm mov bx,7
> asm int 16
> }
>
> Jel' mislis na nesto ovako ;>
Naravno ne, gornji program kad linkuješ i dalje je velik. Trik
je potpuno suprotan -- umesto klasičnog run-time smestiš svoj
(to parčence mora na mašincu). Onda SVE ostalo pišeš na C-u
(suprotno od ovog gore) s tim što ne smeš da koristiš bibliotečke
funckije koje zavise od rt.
asembler.160biber,
>> Naravno ne, gornji program kad linkujes i dalje je velik. Trik
>> je potpuno suprotan -- umesto klasicnog run-time smestis svoj
>> (to parcence mora na masincu). Onda SVE ostalo pises na C-u
Naravno da ne :) U pitanju je bila sala.
Pa mozes li da nam demonstriras to ovde?
Da okacis taj rt? Svakako to ima veza sa temom. A i
C dodatak koji se nadovezuje posle na rt nece skoditi.
BTW sta bese sa tvojim Concurrent C++ (moze i na mail
ako je prica suvise duga za "asembler")
asembler.161kovacevicd,
> SB-pro ima 8-bitne pretvarace.
Da li si siguran, ja mislim da on ima 16 bitne pretvarače i to
stereo. Inače u fajlu se navode funkcije samo za SB običan a on je
8-bitni. Inače probao sam date instrukcije i radilo je.
Da li imaš neke informacije o programiranju WSS (Windows system
sound) , SB-PRO-a i SB-16.
asembler.162janko,
> Pa mozes li da nam demonstriras to ovde?
Da, rt jeste asembeler. Ali ostatak je C. Čitaš li C konf?
Ja bih o tome tamo... Kad malo razmislim, i to bi vredelo za jedan
članak u Računarima, kad već pišem. A znam da ću morati dosta da
pišem i ako počnemo u konf. biče dosta pitanja...
> Da okacis taj rt? Svakako to ima veza sa temom. A i
> C dodatak koji se nadovezuje posle na rt nece skoditi.
Može, sve. Evo ovako: ovde ide samo sors RT BEZ KOMENTARA. Tebi na
eventualna pitanja odgovaram telefonom, a cela priča će biti u
binarnom obliku samo ako pišem članak za Računare...
> BTW sta bese sa tvojim Concurrent C++ (moze i na mail
> ako je prica suvise duga za "asembler")
E to je priča za C++ konf. :)
Odgovor na ovo pitanje, onoliko koliko znam, tamo.
asembler.163zormi,
*> SB-pro ima 8-bitne pretvarace.
*
* Da li si siguran, ja mislim da on ima 16 bitne pretvarače i to stereo.
SB Pro originalni model može da semluje na 22 kHz stereo ili 44 kHz mono
ali 8bitno u oba slučaja. SB Pro kompatibilci svi odreda mogu da rade
na 44/48 kHz stereo 16bitno ali uz sopstvene driver-e.
asembler.164biber,
>> Da li imas neke informacije o programiranju WSS (Windows system
>> sound) , SB-PRO-a i SB-16.
Za ovo prvo nemam, za drugo sam ti vec ostavio u konf.
Trece imam ponesto al' ti to nece pomoci ako radis sa
nekim klonom. Oni (valjda) rade preko svojih drajvera.
Inace sve ovo je za DOS. Za windows nemam nista.
Ima li ko?
Mada, za tvoje potrebe (merenje elektricnih velicina)
je sasvim dovoljno 8-bitno semplovanje, koje je jako lepo
objasnjeno u fajlu koji sam vec kacio.( a bilo ih je jos
gomila kacenih na sezamu)
asembler.165kovacevicd,
Da li bi mogao da mi objasniš kako poslati na određen
kanal levi ili desni direktno vrednost kao i za semplovanje
levog ili desnog kanala mislim na SB-PRO.
Inače imam neke adrese za SB_PRO
LEFT_FM_STATUS 0x00
LEFT_FM_ADDRESS 0x00
LEFT_FM_DATA 0x01
RIGHT_FM_STATUS 0x02
RIGHT_FM_ADDRESS 0x02
RIGHT_FM_DATA 0x03
MIXER_ADDRESS 0x04
MIXER_DATA 0x05 da li bi mogao da mi objasniš ovo
oko mixera za ove dve adrese?
I ako bih sklonio kondezatore na izlazu i ulazu muzičke kartice
i ugradio otpornike za direktnu spregu da li će biti nekih problema
u radu i da li će to raditi. Inače zbog kondezatora kartica se može
koristiti samo u neizmeničnim režimima rada ništa od jednosmernog
režima postavim sada napon on se pojavi i onda smanji na 0 zbog
kondezatora i potrošača.
asembler.167kovacevicd,
Bio sam pitao u vezi programiranja mixer-a na SB-PRO-u pa
sam našao uputstvo u arhivi
PCGPE=PC game programmer's encyclopedia 'PCGPE.RAR' (613632 bytes)
u konferenciji PC.PROG.5 poruka 31.470 datoteka SBPRO.TXT
asembler.168legend,
Zamolio bih nekog da mi popiše dobre knjige za učenje asm, jer hoću da
naučim, a nemam odakle :(. Ako neko zna gde ima da se nadje neki dobar faq
o asm, nek mi kaže, bio bih mu veoma zahvalan.
10x
Legend of LoC!
asembler.169mdimitrijevic,
> Zamolio bih nekog da mi popise dobre knjige za ucenje asm,
> jer hocu da naucim, a nemam odakle :(. Ako neko zna gde
> ima da se nadje neki dobar faq o asm, nek mi kaze, bio bih
> mu veoma zahvalan.
Sto se knjiga tice stvarno ne znam ni jednu koja bi ti pomogla.
Bar ja nisam naucio asembler iz knjiga. Mogu da pogledam kod sebe nekoliko
FAQ-uova, pa cu poslati ako nadjem nesto pogodno za ucenje.
asembler.170pdeze,
Znam da poruka bas i ne ide u ovu temu, ali tema ms.dos je malo
odumrla :)
Znaci: zna li ko koji se sve registri salju na stack kada se pojavi
interrupt? A potreban mi je i redosled registara na stacku u tom slucaju.
Hvala unapred!
asembler.171obren,
> Znam da poruka bas i ne ide u ovu temu, ali tema ms.dos je malo
> odumrla :)
Naprotiv, poruka pre spada u ovu temu, nego u ms.dos :)
> Znaci: zna li ko koji se sve registri salju na stack kada se pojavi
> interrupt? A potreban mi je i redosled registara na stacku u tom
> slucaju.
Stek raste ka opadajućim adresama, a SP pokazuje na zadnju zauzetu
lokaciju. Guraju se prvo flegovi pa kompletna povratna adresa CS:IP.
Pošto je kod Intela uvek niži bajt svega na nižoj adresi, lako ćeš
zapamtiti da se prvo gura CS pa IP, kako bi IP bio na nižoj adresi
(tako raste stek).
Slikovito:
│ │
├───────┤
│ ... │ <-- SP+6
├───────┤
│ Flags │ <-- SP+4
├───────┤
│ CS │ <-- SP+2
├───────┤
│ IP │ <-- SP (u trenutku ulaska u ISR)
└───────┘
Vrh steka
asembler.172biber,
>> Znaci: zna li ko koji se sve registri salju na stack kada se pojavi
>> interrupt? A potreban mi je i redosled registara na stacku u tom slucaju.
Samo fleg registar.
I povratna adresa naravno (CS:IP)
To znaci da bi iz interapta mogao da se vratis i sa:
popf
retf
asembler.173obren,
> To znaci da bi iz interapta mogao da se vratis i sa:
>
> popf
> retf
Ne bi mogao. Ovako sa POPF ne skidaš flegove nego IP, a onda RETF pogrešno
pokupi Flags:CS kao povratnu adresu i program ode u hipresvemir ;)
asembler.174biber,
>> > To znaci da bi iz interapta mogao da se vratis i sa:
>> >
>> > popf
>> > retf
>>
>> Ne bi mogao. Ovako sa POPF ne skidas flegove nego IP, a onda RETF pogresno
Tako je. Nisam razmisljao kad sam pisao. Naime, cesto sam koristo
pushf
call far ....(stvarna adresa interapta)
pa napravio analogiju sa ovim (pogresnu :)
asembler.175pdeze,
>> Znam da poruka bas i ne ide u ovu temu, ali tema ms.dos je
>> malo odumrla :)
>
> Naprotiv, poruka pre spada u ovu temu, nego u ms.dos :)
Pa, da. Ovo je jedna od mojih vecih gluposti u poslednje vreme. :(
Poruka bi trebala da ide u temu ibm.pc.
Hvala na objasnjenju.
asembler.176npmiki,
Prelistavajuci neki intro sa TD286 naisao sam na :
MOV FS,CX ????
sta je ovo FS , nisam mogao da nadjem nigde u literaturi ?
asembler.177mdimitrijevic,
> MOV FS,CX ????
> sta je ovo FS , nisam mogao da nadjem nigde u literaturi ?
FS je segmentni registar 386 i novijih racunara. Vecina novijih
INTRO-a i DEMO-a je radjena za 386 i bolje racunare. Na taj nacin se dobija
mogucnost da se koriste ekstra registri kojih ima vise kod 386 racunara. Kao
i mnoge druge pogodne naredbe (32 bitni registri, MOVSD, itd).
asembler.178npmiki,
Dali neko zna kako da uradim scrool u text modu ?
Naravno , preko registara vga karte .
Unapred zahvalan
ps. scrool u grafici sam savladao , pa me zato ne interesuje .
asembler.179mdimitrijevic,
Neko je trazio nesto o skrolovanju u text modu. Nisam stigao ranije
da posaljem. Ovo je primer koji se nalazi u ASMSNIP arhivi. Mislim da je
radjen za A86 asembler. Hteo sam da stavim komentare kod registara da bi
znali kako se ovo radi, ali nemam vremena. U text modu se mogu dobiti
split-screen efekti itd. Vecina stvari koje mozete da dobijete u grafickom
nacinu moze i u text modu (osim grafike naravno :).
panning.zipasembler.180mc.kuzma,
Da li neko ima asembler za ZX-a na PC-u?
Hitno je...
asembler.182tomil,
> Da li neko ima asembler za ZX-a na PC-u?
>> Ako ipak nađeš Z80 asembler koji radi pod dosom, mail me :)
Jel ovako nešto:
This is the shareware distribution disk for TASM - a table
driven assembler. The files on the disk include:
TASM.EXE - TASM Assembler, executable
TASM48.TAB - 8048 Instruction definition table
TASM51.TAB - 8051 Instruction definition table
TASM65.TAB - 6502 Instruction definition table
TASM85.TAB - 8085 Instruction definition table
TASM80.TAB - Z80 Instruction definition table
TASM05.TAB - 6805 Instruction definition table
TASM32.TAB - TMS320 Instruction definition table
TASM68.TAB - 6800/6801 Instruction definition table
TASM70.TAB - TMS7000 Instruction definition table
TASMDOC.ZOO - TASM Documentation
README - Brief Explanation of Disk contents
COPYRIGH.T - Copyright notice
ORDER.FRM - Order Form
BOOZ.EXE - Archive extracter
ili nešto od ovoga:
Microtec ASM180 Release 3.0D - kros asembler za HD64180
ASMZ80.exe - Microtec Z80 assembler V4.4b
XASMZ80.com - Avocet Z80 assembler V1.03M
AVSIMZ80.exe - Avocet Z80 simulator/debuger V1.01
Uzgred replicirao sam na sledeću poruku:
===============================
5.181 PCPROG.6:asembler
dzakic, 17.08.96. 14:17, 287 chr
Odgovor na 5.180, mc.kuzma, 16.08.96. 18:06
---------------------------------------------------------
> Da li neko ima asembler za ZX-a na PC-u?
> Hitno je...
S obzirom da je hitno, a da asembler za ZX ne postoji (?) u PC
varijanti, šaljem ti Devpac u verziji Vlade Kostića za Spektrum
Simulator - nadam se da ga imaš.
Ako ipak nađeš Z80 asembler koji radi pod dosom, mail me :)
----------------------------------------------- 5.181 ---
Gde se izgubi?
tabasm.zipasembler.184npmiki,
Ja sam trazio scroll u text modu .
Hvala puno !
sajonara :)
asembler.185ognjen,
Hocu da iz jednog programa (mali COM file), pozovem drugi
(veci EXE) ali na samom kraju, tj. da se posle ne vracam u COM
program. Kako to da izvedem? Int 021 f-ja 04c radi nesto slicno,
ali meni ne treba povratak u COM program, samo treba da pozove
EXE i da vise ne zauzima memoriju.
Kako to da izvedem?
asembler.186dzakic,
> Hocu da iz jednog programa (mali COM file), pozovem drugi
> (veci EXE) ali na samom kraju, tj. da se posle ne vracam u COM
> program. Kako to da izvedem? Int 021 f-ja 04c radi nesto slicno,
> ali meni ne treba povratak u COM program, samo treba da pozove
> EXE i da vise ne zauzima memoriju.
Uh :). Sećam se da je bila jedna zanimljiva diskusija baš oko
ovoga nekada davno, daleke '89 ili '90, u konferenciji pcsoft.
Konferencija je još uvek tu, sačuvana je, pa pokušaj nekim
find-om da pronađeš tu diskusiju.
Ne sećam se, na žalost, šta je zaključeno na kraju, ali je bilo
interesantnih predloga i rešenja, kao što je regularan izlazak
iz programa i stavljanja imena sledećeg u keyboard buffer :).
asembler.187zeljkoj,
> Uh :). Sećam se da je bila jedna zanimljiva diskusija baš oko
> ovoga nekada davno, daleke '89 ili '90, u konferenciji pcsoft.
Da, DejanR je isto to pitao 13.11.1989, :) poruka 8.6.
Cela diskusija se nalazi i u Računarima 59, od marta 1990. - rubrika
Priča se na Sezamu. :)
BTW, u BASIC-u RUN "fajl.exe" radi upravo to.
asembler.188tomislavr,
> Hocu da iz jednog programa (mali COM file), pozovem drugi
> (veci EXE) ali na samom kraju, tj. da se posle ne vracam u COM
> program. Kako to da izvedem? Int 021 f-ja 04c radi nesto slicno,
> ali meni ne treba povratak u COM program, samo treba da pozove
> EXE i da vise ne zauzima memoriju.
Koliko znam nema regularnog načina da se ovo izvede pod DOS-om. Recimo
Borland C ima P_OVERLAY konstantu kao način spawnovanja ali ona nema
nikakvog efekta, odnosno ubačena je radi kompatibilnosti sa nekim drugim
platformama. Dakle, ostaje ti hakeraj, mada pošto kažeš da .EXE program
pozivaš iz malog .COM programa, pretpostavljam da i nije neki problem
što će ti on ostati u memoriji dok se .EXE izvršava...
asembler.189mdimitrijevic,
> interesantnih predloga i resenja, kao sto je regularan
> izlazak iz programa i stavljanja imena sledeceg u keyboard
> buffer :).
Sta fali ovakvom resenju :) Ja sam ga koristio kada sam napisao
program koji u odredjeno vreme startuje neki drugi program. Prosto samo
bacim ime programa u keyboard buffer.
Sto se tice poruke na koju si replicirao. Treba pronaci poruke uz
koje su zakaceni fajlovi koji se zovu CHAIN*.*, nisam siguran za celo ime.
Ako ih mozda nema na Sezamu mogu ja da potrazim kod mene.
asembler.190pedjak,
> Uh :). Sećam se da je bila jedna zanimljiva diskusija baš oko
> ovoga nekada davno, daleke '89 ili '90, u konferenciji pcsoft.
Čini mi se da je na kraju Vlada Kostić pronašao u nekoj biblioteci
za C funkciju koja upravo radi to. Na kraju su tu funkciju
disemblirali i otkrili o kom pozivu se radi zapravo
Treba proveriti u konferenciji.
asembler.191biber,
>> platformama. Dakle, ostaje ti hakeraj, mada pošto kažeš da .EXE program
>> pozivaš iz malog .COM programa, pretpostavljam da i nije neki problem
>> što će ti on ostati u memoriji dok se .EXE izvršava...
Svejedno je da li je COM mali ili veliki. COM program uvek
zauzima 64Kb u memoriji.
asembler.192obren,
> Svejedno je da li je COM mali ili veliki. COM program uvek
> zauzima 64Kb u memoriji.
Ali možeš da shrink-uješ memoriju koju program zauzima na neophodnu
vrednost. Prost primer ti je da pozoveš COMMAND /C MI.COM gde je MI.COM
onaj programčić za prikaz zauzeća memorije. Videćeš da se COMMAND sveo
na 3-4 kilobajta pre nego što je pozvao MI, a isto može da uradi i
tvoj program.
Nego, konačno nađoh arivicu koja je svojevremeno bila okačena posle
pomenute rasprave na ovu temu na Sezamu, negde '92. godine. Dakle rešenje
postoji, ali nije nikakav poziv nedokumentovane funkcije. Pogledajte .ASM
sors koji je priložen, jako interesantno...
chain.zipasembler.193ognjen,
)-> Sto se tice poruke na koju si replicirao. Treba pronaci
)-> poruke uz koje su zakaceni fajlovi koji se zovu CHAIN*.*,
Ok, nasao sam. Koga zanima to su poruke 8.24 (elgantno) i
8.26 (hakersko resenje) u konferenciji PCSOFT.
asembler.194bceklic,
> Nego, konacno nadoh arivicu koja je svojevremeno bila okacena
> posle pomenute rasprave na ovu temu na Sezamu, negde '92.
> godine. Dakle resenje postoji, ali nije nikakav poziv
> nedokumentovane funkcije. Pogledajte .ASM sors koji je
> prilozen, jako interesantno...
Resenje je napravljeno specificno za TP. Samo resenje problema
je u principu vezano upravo za jezik u kome se radi. Ako se radi
u asm-u ono je najjednostavnije...
Za vise jezike problem se komplikuje zbog potreba vracanja
interapta koje preuzima odgovarajuca startup procedura.
U sustini potrebno je:
- vratiti sistem u prethodno stanje vracanjem preuzetih interapta
- u potpunosti osloboditi zauzetu memoriju
Najlakse se izvodi uz pomoc 21/4A pri cemu se prvo zatrazi
ukupna raspoloziva memorija (trazi se nemoguce BX=FFFFH). Ovaj broj
se moze izracunati i pretrazivanjem MCB-ova ciji je vlasnik program
ali je prvo resenje lakse. Potom se raspoloziva memorija dodeli
novom programu uz pomoc iste funkcije.
- ucitati program i predati mu kontrolu
U primeru se koristi 21/4B03 (load program). Za novi program se
moze kreirati novi PSP ili iskoristiti PSP postojeceg i ucitati
program preko postojeceg programa. Moguce je i iskoristiti i
nedokumentavanu funkciju 4B01 (load but don't execute) (koju inace
koriste debagari za ucitavanje programa).
Moguce je i naravno napraviti sopstvenu rutinu za ucitavanje
programa sto i nije resenje za pocetnike...
Na kraju se covek upita cemu sve ovo. Zar nije elegantnije
osloboditi nepotrebnu memoriju i izvrsiti program sa 4B00 a potom
samo zavrsiti sa radom?
asembler.196biber,
PROTDEMO is a demo program that is intended to show how to program
the 80386 to go to protected mode, set up virtual mode interrupt handlers,
do some console I/O using interrupts, and finally return to 80386 real
mode.
protdm.zipasembler.197biber,
P5 CODE MACRO FILE FOR USE WITH MICROSOFT MASM 5.1 OR LATER
ASSEMBLER.
These macros have been developed by Intel Corporation and have
been verified on a working P5 system.
You have Intel's permission to incorporate these macros into
your product royalty free.
p5masm.zipasembler.198bilder,
Kako da debagujem program koji koristi PMODE extender od Tran-a ?
Probao sam TD i posle odredjenih instrukcija racunar se jednostavno resetuje !
asembler.199mdimitrijevic,
> Kako da debagujem program koji koristi PMODE extender od
> Tran-a ? Probao sam TD i posle odredjenih instrukcija
> racunar se jednostavno resetuje !
Za sada nikako :( Posto PMODE (naravno) baci racunar u protected mode
a TD nije protected mode debuger. Mozda je moguce sa Soft-Ice debuger-om ali
ima prilicno los interfejs, pa je malo tezak za koriscenje. Uzgred, postoji
TDX (Turbo Debuger za DPMI) ali on radi samo sa "svojim" formatom programa.
Jedini debuger koji moze da debug-uje Protected Mode programe je
WD (Watcom Debuger), ali on radi samo sa DOS4GW extender-om. Nije
jedini ali ja samo za njega znam.
asembler.200biber,
>> Kako da debagujem program koji koristi PMODE extender od Tran-a ?
>> Probao sam TD i posle odredjenih instrukcija racunar se jednostavno
>> resetuje !
Može li SoftIce? Bio je već kačen na Sezamu.
asembler.201legend,
-=-> Može li SoftIce? Bio je već kačen na Sezamu.
Koja poruka? Ako te ne mrzi, pogledaj ili nakači ponovo, leba ti...
Legend of LoC!/eXplosives
Alone till doom's day!
asembler.202biber,
>>-=-> Može li SoftIce? Bio je već kačen na Sezamu.
>>
>> Koja poruka? Ako te ne mrzi, pogledaj ili nakači ponovo, leba ti...
Na sezamu imaš naredbe za pretraživanje (čiju sintaksu ni ja
neznam na pamet- uvek se poslužim HELPom) pa ćeš i ti možeš to da
uradiš isto tako dobro ili loše koliko i ja :)
Ako se fajl zagubio prilikom zamene softvera s početka ove
godine, kaži pa ću da šaljem.
asembler.203stameni,
Kod interapta 21h funkcija 35h nalazi adresu interapta datog u
AL (dakle, mov ah, 35h / mov al, <broj> / int 21h). Funkcija 25h
postavlja vektor na interapt čiji je broj dat u AL. Tako svi kažu
("Sve MS DOS funkcije", HELPPC, DOSREF, TECHHELP...), uključujući
i spisak interaptova Ralfa Browna.
Kod ovog poslednjeg piše takođe to isto, ali uz još neke
dodatne informacije, koje me malo zbunjuju. Koliko sam shvatio,
radi se o podfunkcijama funkcija 25h i 35h koje se dobijaju preko
registra AL. E, tamo je navedeno da nekoliko prvih podfunkcija
funkcije 25h koristi nešto što autor naziva "Phar Lap 386/DOS -
Extender", a funkcije 35h "Flash Teck X-32 VM". Šta je to, i kako
kod takvih računara (ako su to tipovi računara) funkcionišu ove
dve podfunkcije? Koliko se sme računati na "opštost" ovih dveju
funkcija?
asembler.204legend,
-=-> Na sezamu imaš naredbe za pretraživanje (čiju sintaksu ni ja
-=-> neznam na pamet- uvek se poslužim HELPom) pa ćeš i ti možeš to da
-=-> uradiš isto tako dobro ili loše koliko i ja :)
Ajd kad ti kažeš, ali kako je ime? Softice*? Sice*? Softi*?
-=-> Ako se fajl zagubio prilikom zamene softvera s početka ove
-=-> godine, kaži pa ću da šaljem.
Ajd, da proverim pa ću da vičem...
Legend of LoC!/eXplosives
Alone till doom's day!
asembler.205mdimitrijevic,
> Ajd kad ti kazes, ali kako je ime? Softice*? Sice*? Softi*?
SICE*.* ili S-ICE*.*
asembler.206mdimitrijevic,
> funkcije 25h koristi nesto sto autor naziva "Phar Lap 386/DOS -
> Extender", a funkcije 35h "Flash Teck X-32 VM". Sta je to, i kako
> kod takvih racunara (ako su to tipovi racunara) funkcionisu ove
> dve podfunkcije? Koliko se sme racunati na "opstost" ovih dveju
> funkcija?
Dva nabrojana cudna imena su nazivi Dos Ekstendera i ne bi trebalo da
te zbunjuju. Koriste se da bi pruzili mogucnost koriscenja celokupne memorije
racunara u zasticenom rezimu rada (protected mode). Znaci to nisu tipovi
racunara, a funkcije rade bas ono sto ti kazu svi helpovi i sto si i sam
naveo. Znaci, nemas frke :)
asembler.207nekromant,
Da li neko moze da mi posalje neku dokumentaciju u vezi Xmode-a,
i uopste niskom programiranju VGA kartica.
asembler.208mdimitrijevic,
> Da li neko moze da mi posalje neku dokumentaciju u vezi Xmode-a,
> i uopste niskom programiranju VGA kartica.
Evo nesto sto sam na brzinu skupio. Sve je na engleskom. Primeri
su o programiranju VGA karti (X-MODE, Scroll ...). Primeri su u ASM-u, C-u i
PASCAL-u. Nadam se da ce ti pomoci, ako negde zapnes javi se.
vga_prog.zipasembler.209biber,
>> Ajd kad ti kažeš, ali kako je ime? Softice*? Sice*? Softi*?
ICEDEBUG.RAR i S-ICE.ARJ
To su DOS i WINDOWS verzije.
asembler.210bilder,
Da li se na neki nacin moze ostvariti u nekom od modova sa 16 boja , recimo
10h ili 12h, hardverski skrol samo odredjenih ravni a ne svih kao sto je to
slucaj ako pomenuti skrol radimo preko porta 3d4h i indeksa 0ch i 0dh ?!?
asembler.211bilder,
Evo jos jednog pitanja..
..rec je o alociranju extended memorije pod Tran-ovim PMODE-om
naime posle sledeceg:
_main:
sti
mov eax,1024*1024 ; 1Mb
call _gethimem
jc NotEnoughHiMem
mov [Buf],eax
...
bilo kakvo brljanje po upravo alociranom baferu rezultuje resetovanjem
racunara ... da uzeo sam u obzir da je to linearni pointer i vrednost _code32a
!!!
sta da uradim pa da to ne bude tako ?!?
asembler.212sasab,
Ima li neko disasembliranu rutinu za int17h iz nekog 286 BIOS-a?
Bogi
asembler.213mdimitrijevic,
> Da li se na neki nacin moze ostvariti u nekom od modova sa 16 boja ,
> recimo 10h ili 12h, hardverski skrol samo odredjenih ravni a ne svih kao
> sto je to slucaj ako pomenuti skrol radimo preko porta 3d4h i indeksa 0ch
> i 0dh ?!?
Ne. Mozes jedino sa prebacivanjem blokova memorije (REP MOVSB).
asembler.214mdimitrijevic,
> ..rec je o alociranju extended memorije pod Tran-ovim PMODE-om
> naime posle sledeceg:
Mozda je problem ako alocira EMS memoriju. Znam da je bilo nekih
problema sa alociranjem bas kod EMS memorije. Poslacu poslednju verziju
PMODE-a v1.24 pa probaj.
asembler.215mdimitrijevic,
PMODE v1.24, najnovija verzija Tran-ovog Protected Mode
Extendera.
pmw124.zipasembler.216jexy,
; PMODE v1.24, najnovija verzija Tran-ovog Protected Mode
;Extendera.
Izgleda da bas nisi u toku .. evo PMODE v2.51 i PMODE v3.06 od Tran-a
pm-11-94.zipasembler.217mdimitrijevic,
Ono sto sam poslao je PMODE extender za WATCOM C. I v1.24 je poslednja
koju su izbacili. Tj. poslednja koja se pojavila na FTP.CDROM.COM-u.
Ovo sto si ti poslao je odvojeni extender za ASM.
asembler.218mdimitrijevic,
Evo, da ne bi bilo zabune. FILE_ID.DIZ fajl za PMW124.ZIP, Tran-ov
extender koji zamenjuje DOS4GW.EXE kod Watcom C programa.
Ň════════════════════════════════════Ş
│▒▒▒▒ PMODE/W v1.24 DOS Extender ▒▒▒▒│
│▒▒▒▒ For use with WATCOM C/C++ ▒▒▒▒│
│────────────────────────────────────│
│ Features: │
│ ˙ Extender size is less than 10k │
│ ˙ Extender is internal to the EXE │
│ ˙ Replaces DOS4GW.EXE │
│ ˙ Fully compatible with WATCOM C │
│ ˙ Fast execution │
│ ˙ Free for non-commercial use │
│ ˙ Protected mode EXE compression │
│────────────────────────────────────│
│ Changes in Version 1.24: │
│ ˙ EMM386/NOEMS bug fixed │
│ ˙ Added INT 31h/AX=0002h │
│ ˙ Improved PMWSETUP program │
│ ˙ See UPDATES.DOC for more changes │
ď════════════════════════════════════ż
asembler.219jexy,
; Ono sto sam poslao je PMODE extender za WATCOM C. I v1.24 je poslednja
;koju su izbacili. Tj. poslednja koja se pojavila na FTP.CDROM.COM-u.
; Ovo sto si ti poslao je odvojeni extender za ASM.
Da ja nisam mislio ,s' obzirom na naziv teme,da saljes extender za Watcom C
ali nije ni bitno..vazno je da smo isterali to na videlo
asembler.220stameni,
Jednom je, valjda u nekim starijim "Računarima" u "Bajtovima
lične prirode", bio objavljen programčić-primer pisanja zvuka u
asembleru. Kako nisam mogao da nađem u kom časopisu sam to čitao,
malo sam se sam petljao u vezi sa zvukom, pa rezultate tog
petljanja iznosim ovde. Možda nekome korisno posluži.
Mada je program pisan za a86, lako se može ubaciti kao
procedurica za neki drugi programski jezik.
org 100h
cli
mov al, 0b6h ; b6h = 10110110b
; Prvo se priprema Programmable Interval Timer
; (PIT) za generisanje zvuka. Najpre se postavlja
; Mode Control Register na portu 43h (od 7. ka 0.):
; 10 - selektovanje countera 2 na portu 42h
; 11 - naglašava se da se šalje prvo LSB pa
; MSB frekfencije zvuka
; 011 - neka PIT generiše četvrtast signal
; 0 - binarni brojač
out 43h, al ; Dakle, pripremljeni al gurnuti na 43h,
mov al, 18h ; a zatim poslati
out 42h, al ; LSB,
mov al, 12h ; pa MSB
out 42h, al ; frekfencije.
in al, 61h ; Uključi zvučnik preko 8255 Programmable Periprhe-
or al, 03h ; ral Interfacea, port B
out 61h, al
mov bx, 10 ; Malo se vrti
xor cx, cx ; ne radeći
loop1: loop loop1 ; ništa
dec bx ; naročito :)
jnz loop1
in al, 61h ; Isključi
and al, 0fch ; zvučnik
out 61h, al ; preko PPI-a.
sti
ret
Asemblirati sa:
a86 primer.asm primer.com
asembler.221mdimitrijevic,
> Da ja nisam mislio ,s' obzirom na naziv teme,da saljes extender za Watcom
> C ali nije ni bitno..vazno je da smo isterali to na videlo
Da, pa vidi stvarno ! Uopste nisam primetio da je tema asembler.
asembler.222stameni,
Kako poslati modemu na COM3 ili COM4 komandu ATD ? Ne treba mi
ni jedna druga.
asembler.223space.ace,
>> Kako poslati modemu na COM3 ili COM4 komandu ATD ? Ne treba mi
>> ni jedna druga.
Evo ti sors u asembleru, malo iskomentarisan.
---seci---
;inicijalizuje COM3
mov ah, 00h ; funkcija 00h za inicijalizaciju porta
mov al, 11100011b ; parametri porta (treba li da objasnim?)
mov dx, 2 ; koji je port (com1-0, com2-1,com3-2, com4-3)
int 14h ; interapt za rad sa portovima
; šalje na COM3 prvo 'a'
mov ah, 01h ; funkcija za pisanje po portu
mov al, 'a'
mov dx, 2 ; mora da se navede i u koji port se piše
int 14h
; pa 't'
mov ah, 01h
mov al, 't'
mov dx, 2
int 14h
; pa 'd' (sve zajedno 'atd') što podiže slušalicu .
mov ah, 01h
mov al, 'd'
mov dx, 2
int 14h
; ali ipak pre toga mora da se udari Enter
mov ah, 01h
mov al, 13
mov dx, 2
int 14h
; šalje poruku na ekran
mov ah, 09h
mov dx, offset(poruka)
int 21h
; završava program
mov ah, 4ch
mov al, 0
int 21h
poruka db 'ATD poslato na port!$'
; kraj programa
---dovde---
E sad, može i malo jednostavnije, ali ne mogu se u trenutku setim. Inače,
ovo sam izveo bacanjem karaktera na comm port, funkcijom 01h interapta
14h (zato sam nekoliko puta ispisao mov ax, 01h, da bi se uočilo :).
Nabavi HelpPC ili NG za ASM, tamo ima dosta o ovome...
Ako ti još uvek nije jasno, opet pitaj...
asembler.224obren,
Neko je tražio dokumentaciju o radu sa COM portovima. Uz poruku je veoma
detaljan i kompletan DOC o UART (Universal Asynchronous Reciever/Transmiter)
(C) Chris Blum.
uart.zipasembler.225obren,
Kad smo već kod Crhis Bluma, u njegovom tekstu o UART-u pominje se i neka
dokumentacija o programabilnom prekidnom kontroleru 8259pic. Svojevremeno
sam mu pisao da mi to pošalje što je on i učinio (ko kaže da su oni Nemci
loši momci ;). Uz poruku je taj fajl, uz napomenu da nije ništa posebno
upotrebljivo, ništa konkretno o programiranju - jednostavno se objašnjava
princip rada 8259-ke što doduše korisno dođe pri upotrebi HelpPC-a i sl.
pic8259.docasembler.226dzakic,
> Kako poslati modemu na COM3 ili COM4 komandu ATD ? Ne treba mi
> ni jedna druga.
Ukratko, BIOS neće radi sa com3 i com4 jer u bios bloku za
njihovu adresu stoji 0. Dakle, treba uraditi nešto ovako:
Program Addports;
var comport: array[1..4] of word absolute $40:$00;
begin
if comport[1]=0 then comport[1]:=$3f8;
if comport[2]=0 then comport[2]:=$2f8;
if comport[3]=0 then comport[3]:=$3e8;
if comport[4]=0 then comport[4]:=$2e8;
end.
Nakon toga, može se slati znak na port sa int 14h, fja 0 za
inicijalizaciju, fja 1 za slanje znaka. Naravno, bolje je da za
to koristiš neki fosil drajver.
asembler.227stameni,
>> Nabavi HelpPC ili NG za ASM, tamo ima dosta o ovome...
Da, pogledao sam neke "elektronske" helpove (pre svega
interrupt liste INTER42.*) i video da ovaj primer koji si naveo
treba da radi. Samo, meni ne radi :(
Konkretno, posle ovoga:
;inicijalizuje COM3
mov ah, 00h ; funkcija 00h za inicijalizaciju porta
mov al, 11100011b ; parametri porta (treba li da objasnim?)
mov dx, 2 ; koji je port (com1-0, com2-1,com3-2, com4-3)
int 14h ; interapt za rad sa portovima
ne menjaju se ah (line status) i al (modem status) kao što bi,
valjda, trebalo. Malo sam modifikovao al registar jer imam 2400
modem, pa se ni tada ne dešava ništa - niti se promene ah i al,
niti program "digne slušalicu".
>> Ako ti još uvek nije jasno, opet pitaj...
Nije jasno. Razmišljao sam o tome da, što se tiče slanja na
modem preko int 14h, računar nije brži no što modem prima, pa sam
imao ideju da ubacim neke pauze kod slanja podataka. No, ta
potencijalna brzina ne objašnjava nemenjanje ax u citiranom delu
programa, a takođe prilikom traceovanja iz debuggera (i DEBUG i
TD) naredbu po naredbu ne dolazi do dizanja slušalice.
Huh, nije valjda problem toliko težak?
asembler.228space.ace,
>> Ukratko, BIOS neće radi sa com3 i com4 jer u bios bloku za
>> njihovu adresu stoji 0. Dakle, treba uraditi nešto ovako:
Nije mi baš jasno, meni je modem na com3, onaj moj primer radi perfektno!
Znači, ili nisi ti u pravu, ili nešto ovde ne štima :))
asembler.229space.ace,
Nije mi jasno što ti ne radi? Na kom portu ti je modem? Ako ti je na com4,
trebalo bi da promeniš dx, da staviš 3.
Meni sve radi (oprobano više hiljada puta). Takođe sam i napravio da mi
pošalje iz komandne linije neku komandu modemu (kao npr. da digne slušalicu,
okrene neki broj, itd :).
>> ne menjaju se ah (line status) i al (modem status) kao što bi,
>> valjda, trebalo. Malo sam modifikovao al registar jer imam 2400
>> modem, pa se ni tada ne dešava ništa - niti se promene ah i al,
>> niti program "digne slušalicu".
Možda nisi tačno podesio AL registar (pošalji mi kako si to podesio).
Možda u tom grmu leži zec. I dalje mi nije jasno što ne menja ah i al.
asembler.230stameni,
>> >> Ukratko, BIOS neće radi sa com3 i com4 jer u bios bloku za
>> >> njihovu adresu stoji 0. Dakle, treba uraditi nešto ovako:
>>
>> Nije mi baš jasno, meni je modem na com3, onaj moj primer radi
>> perfektno!
Kako kod tebe radi, nemam pojma, ali je činjenica da su adrese
COM3 i COM4 portova kod mene 0 (proverio sam DEBUG-om i PV-om).
Kako je kod tebe? Sve i kad promenim 0040:0004 na 03e8, onaj
primer ne radi :(
asembler.231stameni,
>> Nije mi jasno što ti ne radi? Na kom portu ti je modem? Ako ti
>> je na com4, trebalo bi da promeniš dx, da staviš 3.
Modem je na COM3, kao što sam i bio pitao, a dx je uredno 2.
>> Možda nisi tačno podesio AL registar (pošalji mi kako si to
>> podesio). Možda u tom grmu leži zec.
Nisam otpočetka mislio na to, nego tek kad nije radilo (hint:
rtfm ;). No, evo sadržaja al koji koristim (u odnosu na ono što si
ti poslao promenjen je jedan bit, da bi bilo u skladu sa mojim
2400 modemom):
76543210
10100011 ----> AL
765 (101): 2400 bita u sekundi
43 (00) : bez pariteta
2 (0) : 1 stop-bit
10 (11) : 8 "korisnih" bitova
Na kraju, dva početnička pitanja:
1) Kako u a86 koristiti binarne konstante (ako koristim sufiks 'b'
kako da budem siguran da konstantu asembler ne prepozna kao deo
heksa broja)?
2) Kako (kojim adresnim modom) gađati prvi megabajt memorije,
odnosno kako uraditi mov 1234h:5678h, abh ?
asembler.232ognjen,
)-> 1) Kako u a86 koristiti binarne konstante (ako koristim
)-> sufiks 'b' kako da budem siguran da konstantu asembler ne
)-> prepozna kao deo heksa broja)?
10101100xB
asembler.233jexy,
Ima li ovde neko PMODE/W v1.22 od Tran-a !?!
asembler.234mdimitrijevic,
> Ima li ovde neko PMODE/W v1.22 od Tran-a !?!
Slao sam to u ovoj temi (cini mi se:) u ranijim porukama. Postoji
PMW v1.24 (poslednja verzija).
asembler.235jexy,
; Slao sam to u ovoj temi (cini mi se:) u ranijim porukama. Postoji
; PMW v1.24 (poslednja verzija).
Znam imam i ja verziju 1.24 ali mi bas treba verzija 1.22 !!
Pa ako neko ima...
asembler.236mdimitrijevic,
> Znam imam i ja verziju 1.24 ali mi bas treba verzija 1.22 !!
Evo ti, nemam pojma zasto ti treba starija verzija.
Ň════════════════════════════════════Ş
│▒▒▒▒ PMODE/W v1.22 DOS Extender ▒▒▒▒│
│▒▒▒▒ For use with WATCOM C/C++ ▒▒▒▒│
│────────────────────────────────────│
│ Features: │
│ ˙ Extender size is less than 10k │
│ ˙ Extender is internal to the EXE │
│ ˙ Replaces DOS4GW.EXE │
│ ˙ Fully compatible with WATCOM C │
│ ˙ Fast execution │
│ ˙ Free for non-commercial use │
│ ˙ Protected mode EXE compression │
│────────────────────────────────────│
│ Changes in Version 1.22: │
│ ˙ DPMI compliant INT 1Ch, 23h, 24h │
│ ˙ Utilities updated for WATCOM 10.5│
│ ˙ See UPDATES.DOC for more changes │
ď════════════════════════════════════ż
pmw122.zipasembler.237ognjen,
Gde da nađem parametre diskete (broj glava, cilindara, i
sektora)? U Diskette Parametar Table-u na adresi 0000:0078 se
nalazi puno podataka, ali ni traga od ova tri najosnovnija. (bar
tako kaže Techelp)
U Boot sektoru diskete, ovakvi podaci bi trebali da se nalaze
na nekim malim offsetima, ali šta ako se u boot ugnezdio neki
virus (stoned, na primer) koje ove podatke ne čuva, već se tu
nalazi virusni kod. Čitajući odatle, dobiću pogrešne podatke!
Gde da nađem proklete parametre diskete?!
asembler.238janko,
> U Boot sektoru diskete, ovakvi podaci bi trebali da se nalaze
> na nekim malim offsetima, ali šta ako se u boot ugnezdio neki
> virus (stoned, na primer) koje ove podatke ne čuva, već se tu
> nalazi virusni kod. Čitajući odatle, dobiću pogrešne podatke!
>
> Gde da nađem proklete parametre diskete?!
Boot sektor je dovoljno dobro mesto (jedino, čak ;> )
I virusi moraju da sačuvaju te početne podatke -- tek IZA se smeštaju.
Probaj.
asembler.239mdimitrijevic,
> Gde da nadem parametre diskete (broj glava, cilindara, i
> sektora)? U Diskette Parametar Table-u na adresi 0000:0078 se
Podaci u 'Disk Drive Parameter Table' su vezani vise za
sam hardver disk drajva a ne za podatke o disketi.
> U Boot sektoru diskete, ovakvi podaci bi trebali da se nalaze
> na nekim malim offsetima, ali sta ako se u boot ugnezdio neki
> virus (stoned, na primer) koje ove podatke ne cuva, vec se tu
> nalazi virusni kod. Citajuci odatle, dobicu pogresne podatke!
Boot sektor NECE biti prebrisan ovako kako ti mislis.
Virus se ubacuje u startup kod na pocetku diskete, taj kod se
ionako koristi za dizanje sistema (a to virusu i treba :), pa
ga on po potrebi promeni.
Znaci, Boot Sektor ce imati odgovarajuce podatke o disketi
jer samo na taj nacin DOS moze da zna kakvoj disketi pristupa i o
kakvim podacima se radi.
> Gde da nadem proklete parametre diskete?!
Kao sto rekoh, Boot Sektor, verovatno imas njegovu strukturu.
Ako nemas, da saljem ?
asembler.240ognjen,
)-> Virus se ubacuje u startup kod na pocetku diskete, taj kod se
)-> ionako koristi za dizanje sistema (a to virusu i treba :), pa
)-> ga on po potrebi promeni.
Izvini, nije mi baš najjasnije. Da li bi mogao da mi objasniš
razliku između startup koda i boot sektora. Boot sektor se
(koliko ja znam) nalazi na h0 c0 s1, i zauzima 512 bajtova (jedan
sektor). Šta je onda startup kod?
asembler.241janko,
> Izvini, nije mi baš najjasnije. Da li bi mogao da mi objasniš
> razliku između startup koda i boot sektora. Boot sektor se
> (koliko ja znam) nalazi na h0 c0 s1, i zauzima 512 bajtova (jedan
> sektor). Šta je onda startup kod?
Samo mu ime kaže, kod kojim se inicira "dalje dizanje" sistema. U
starija vremena se taj kod zvao još romantičnije "bootstrap kod".
Naravno da je u boot sektoru diska.
asembler.242stameni,
Zasto sledeci program ne salje modemu odredjeni string (u ovom
slucaju ATD - videti kraj programa)? Mislim da sam radio po svim
"pravilima", al' on ni da bekne. Modem je 2400 na COM3.
program modem;
uses
crt, dos;
const
DelayRate = 100; { pauza izmedju dva poslata znaka }
var
regs: registers;
procedure InitMemory; { adrese COM3 i COM4 }
var
ComPort: array[1..4] of word absolute $40:00;
begin
ComPort[1]:=$3f8;
ComPort[2]:=$2f8;
ComPort[3]:=$3e8;
ComPort[4]:=$2e8;
end;
procedure InitModem(InitParam: byte);
begin
regs.ah := $00;
regs.al := InitParam;
regs.dx := $02;
intr($14, regs);
delay(DelayRate)
end;
procedure ProcessChar(ch: char);
begin
regs.ah := $01;
regs.al := ord(ch);
regs.dx := $02;
intr($14, regs)
end;
procedure ProcessLine(line: string);
var
counter: byte;
begin
for counter := 1 to length(line) do
begin
ProcessChar(line[counter]);
delay(DelayRate)
end
end;
begin
InitMemory;
InitModem($A3); { 10100011 - 101: 2400 bps; 00: no parity;
0: 1 stop bit; 11: word length }
ProcessLine('ATD')
end.
asembler.243biber,
Nekad na 286 racunaru sam mogao u BIOSu da ukljucim video ROM
shadow, i zatim da upisujem sta mi je volja u ram u koji je prepisan
sadrzaj video roma. Zasto to sad ne radi sa novim plocama?
asembler.244stameni,
Kako poslati komandu fossilu X00 iz assemblera?
asembler.245janko,
> Nekad na 286 racunaru sam mogao u BIOSu da ukljucim video ROM
> shadow, i zatim da upisujem sta mi je volja u ram u koji je prepisan
> sadrzaj video roma. Zasto to sad ne radi sa novim plocama?
A zašto bi to radio, da pišeš preko video biosa? Ili si možda
mislio da možeš da korstiš RAM kada ISKLJUČIŠ shadow?
I u kom režimu koristiš tu novu ploču? Kao "goli" DOS ili sa nekim
EMMxxx, HIMEM i slično? Šta u stvari hoćeš, da skratim pitanje...
asembler.246bokir,
Imam pitanje u vezi programiranja u protected modu.
Kako se pristupa direktno određenoj adresi?
Recimo, kako bi sledecći kod izgledao u pm (izvinjavam se zbog
YUSCIIja ;) :
mov ax, 0A000h
mov es, ax
mov es:ŠbxĆ, cl
asembler.247pedjak,
> Zasto sledeci program ne salje modemu odredjeni string (u ovom
> slucaju ATD - videti kraj programa)? Mislim da sam radio po svim
> ProcessLine('ATD')
Nisam detaljno analizirao program, ali da probam na prvu loptu:
probaj da gornju liniju zameniš sa ProcessLine('ATD'+#13). Ako ni
to ne radi, razmislićemo dalje.
asembler.248bokir,
Zašto
mov es:ŠbxĆ, al
izaziva exception, i kako to da izbegnem?
( Ono Š i Ć su uglaste zagrade ;)
asembler.249mdimitrijevic,
> Zasto
> mov es:SbxC, al
>
> izaziva exception, i kako to da izbegnem?
Pitanje je kako si podesio ES i BX registre. Posalji deo koda u kome
ih koristis pa da vidimo sta je problem. Jel ti okida QEMM exception ili sta ?
asembler.250pedjak,
> Kako poslati komandu fossilu X00 iz assemblera?
Korišćenjem odgovarajućeg poziva (videti specifikaciju koja dolazi
uz sam X00)
asembler.251bokir,
> Pitanje je kako si podesio ES i BX registre. Posalji deo koda u kome
> ih koristis pa da vidimo sta je problem. Jel ti okida QEMM exception ili
Izvinjavam se što sam bio neprecizan.
Naime, pokušavam da uradim svoj prvi program u protected modu,
i koristim Blinkerov DOS Extender.
E, taj program bi trebao da inicijalizuje grafiku i ceo ekran
popuni nekom bojom.
Ove probleme sa javljanjem exceptiona sam sredio ;)
I sad program radi savršeno u realnom modu (ispuni ceo ekran),
a u protected modu samo jednu jedinu liniju.
Ispostavilo se da jedan niz koji se sasvim fino inicijalizuje u
realnom modu, u protected modu UVEK bude inicijalizovan nulama! ;(
Zna li neko zašto se ovo dešava?
Inicijalizaciona procedura je prikačena uz poruku.
code.zipasembler.252biber,
>> A zašto bi to radio, da pišeš preko video biosa? Ili si možda
>> mislio da možeš da korstiš RAM kada ISKLJUČIŠ shadow?
Da bi bolje razumeo šta sam hteo da kažem evo banalan primer:
hoćeš da umesto imena proizvođača grafičke kartice upišeš svoje ime.
To je nekad moglo (286), sa uključenim bios shadow. Sad (486, 586)
neće.
>> I u kom režimu koristiš tu novu ploču? Kao "goli" DOS ili sa nekim
Za vreme boota -> F5
asembler.253janko,
> hoćeš da umesto imena proizvođača grafičke kartice upišeš svoje im
> To je nekad moglo (286), sa uključenim bios shadow. Sad (486,
> 586)
> neće.
Pretpostavljam da BIOS-i koriste prednost svih procesora od 386 naviše
da zone u memoriji mogu biti zaštićene za upis (read only). Prednost
je definitivna, jer neispravni programi kojima pointer "greši" ne mogu
da zalude video...
asembler.254janko,
> I sad program radi savršeno u realnom modu (ispuni ceo ekran),
> a u protected modu samo jednu jedinu liniju.
Neko je pisao, mislim baš u ovoj konferenciji, dosta davno
o adresiranju memorije iz protected režima nekog ikstendera...
asembler.255mdimitrijevic,
> Naime, pokušavam da uradim svoj prvi program u protected modu,
> i koristim Blinkerov DOS Extender.
Žao mi je, nisam upoznat sa ovim Extender-om.
> I sad program radi savršeno u realnom modu (ispuni ceo ekran),
> a u protected modu samo jednu jedinu liniju.
Razlike između realnog i protected moda su velike (mada što se težine
rada tiče najviše zavise od toga u čemu pišeš programe). Protected mode koristi
32-bitne registre za adresiranje, moraš da vodiš računa o selectorima i još
po nekim stvarima. Ali, jednom kada prođeš te probleme kasnije će ti biti mnogo
lakše.
Na žalost kao što rekoh nemam pojma kako radi taj Blinkerov DOS
Extender (koristim PMODE i Watcom C). Extender bi morao da ima način da ti
vrati
neke informacije, što možeš videti jedino u uputstvu.
Ukoliko želiš da pišeš u asembleru moj je predlog PMODE od Trana.
Ukoliko želiš da radiš dobro optimizovane protected mode programe u C-u, moj
predlog je Watcom C++ v10.5. A uz njega pored DOS4GW imaš (opet) Tranov PMODEW
extender.
> Ispostavilo se da jedan niz koji se sasvim fino inicijalizuje u
> realnom modu, u protected modu UVEK bude inicijalizovan nulama! ;(
Kao što rekoh potpuno se drugačije adresira u protected modu. Niz
(verovatno) ne bude inicijalizovan nulama od strane programa već to radi
extender po definisanju niza.
asembler.256micke,
*****************************************************************************
Potreban mi je ASEMBLER za procesor 80086 pa ako neko ima neka mi baci
u mail (micke).
*****************************************************************************
asembler.257biber,
Ima li ko 32-binu verziju Soft-Ice (za windows)?
Je li to jos uvek shareware program?
asembler.258bilder,
Prvi DEMO PARTY u YU a evo i oficijelne predinvitacije ;)
----------------------------------------------------------------
Yet Another Lame Party!
Ovo je pred-poziv za YALP parti. "Pred" zbaci da bi se neki detalji mogli
kasnije izmeniti. Konacna verzija ce uskoro biti rasirena.
STA?
Pomalo neobican demo compo parti. Svi radovi moraju da budu 256 bajtova ili
kraci. Kategorije su:
- C-64 demo
- PC demo
- Amiga demo
- Pixel grafika
- ANSI grafika
- ASCII grafika
- Muzika
- Utility
- C-64 igra
- PC igra
- Amiga igra
U kategorijama navedenim bez platforme svi radovi za C-64, Amigu i PC ce biti
u jednoj kategoriji. Za sada razmatramo da spojimo "Igra" i "Demo" (mozda cak
i "Grafika"?) grupe u jedinstvene kategorije. Sta vi mislite?
Ako dovoljno ljudi zatrazi druge kategorije ili druge kompjutere na kojima bi
se radilo, dodacemo ih.
Primetite da za potrebe ovog partija izricito poricemo razliku izmedju demoa i
introa. Postoje bar tri vrlo razlicite definicije introa, tako da cemo
smatrati sve "demolike" radove demoima.
Nakon partija organizovacemo specijalno takmicenje - jos uvek sakupljamo ideje
i za sada je najbolja takmicenje u frikovanju semafora (ponesite sami svoj
alat). Ako imate ideju za ovaj deo, obavestite nas, i molimo vas da ne
predlazete stare stvari vec provaljene na drugim partijima, kao takmicenja u
bacanju diskova ili modema i sl.
KAD?
Sredinom januara 1997. Tacan datum jos nije odredjen, ali racunajte da ce biti
15-ti +/-3 dana. Parti ce trajati jedan dan i jednu noc.
GDE?
U Beogradu, u klubu "Fest" u Zemunu. Najverovatnije.
Imajte na umu da ce jedina korist od ovog partija za klub biti pare koje ce
zaraditi na picu. Imajte razumevanja za ovo i ne donosite svoj alkohol.
ZA STA?
Zalimo, ali nece biti nagrada od velike materijalne vrednosti. Ocekujte da
nagrade budu reda velicine majica sa natpisom "Pobedio sam na YALP-u 1997!"
Odavno smo odustali od potrage za sponzorima. Niko nije zainteresovan.
S druge strane, obratite paznju na to da se ni ne naplacuje ucestvovanje na
partiju.
KO?
Parti ce organizovati MindEscapE.
Ocekujemo da vecina ili svi ucesnici budu iz Jugoslavije, ili cak samo iz
Beograda, jer pretpostavljamo da niko nije toliko lud da putuje sve dovde
samo da bi ucestvovao na bedno organizovanom jednodnevnom partiju na kojem
je glavna nagrada majica ili tako nesto. Od pocetka je parti zamisljen kao
dogadjaj za budjenje Jugoslavije. Naravno, rado cemo primiti i ucesnike iz
inostranstva, narocito iz bivsih jugoslovenskih republika.
U principu ne nameravamo da vam obezbedjujemo prenociste - imamo dovoljno
problema i bez toga. Ako ne mozete da nadjete mesto gde biste odseli u
Beogradu, mi cemo moci da udomimo nekoliko ljudi, ali ne vise od nekoliko!
Kontaktirajte nas pre nego sto dodjete u Beograd bez hotelske rezervacije,
inace rizikujete da spavate u prijateljskim, udobnim i zagrejanim ulicama
punim idilicnih zimskih motiva.
Takodje bi nam bilo drago da unapred znamo za ljude koji planiraju da dodju,
da bismo imali predstavu koliko ce ih biti, i da bismo mogli da organizujemo
parti shodno tome. Ako razmisljate o dolasku na parti, ne zaboravite da nam
javite - ne treba nam definitivno "da", "mozda" ce biti dovoljno.
KAKO?
Nema mnogo ogranicenja. Osim toga sto sve mora biti dugacko 256 bajtova ili
krace, radovi u "umetnickim" kategorijama (grafika i muzika) se mogu predati
ili u manje-vise standardnom formatu ili kao izvrsni programi. Ako se predaju
u izvrsnom obliku, ne smeju niposto biti slucajno generisani - takvi radovi
spadaju u demo kategorije. Takodje, verujemo da se jednostavni deterministicki
ili IFS fraktali predati kao graficki radovi u izvrsnom obliku (iako nisu
zabranjeni ovim pravilom) nece preterano dopasti glasacima. Ako napravite
divan matematicki algoritam koji _stvara_ lep graficki (ili zvucni) izlaz,
njegovo mesto je u demo kategorijama. Izvrsni oblik za umetnicke radove treba
da se koristi samo da bi se _spakovali_ radovi kad ih je lako spakovati, a
nijedan standardni format ne moze da ih spakuje u 256 bajtova ili manje.
Slike ne smeju da imaju pokretne delove, skrolove itd. - IFLI je naravno
dozvoljen.
Radovi ne bi trebalo da ostete nasu opremu, da ne bi neko ostetio i vas.
Bilo bi lepo da DONESETE svoje radove na parti, ali cemo prihvatiti i one koje
posaljete Internet e-mailom na donje adrese. Zapamtite da je samo ucestvovanje
u takmicenju mnogo manje od prisustvovanja na partiju.
ZASTO?
Nikad nije odrzan demo-parti u Jugoslaviji. Par puta su ljudi pokusavali da
organizuju nesto i nisu stigli dalje od planova. Izgleda da je najveci problem
svih koji su ikada pokusali da organizuju nesto takvo ovde bilo nalazenje
sponzora koji bi obezbedili mesto za parti, masine na kojima bi se radilo i
nagrade. Naprosto, svako ko bi mogao da sponzorise parti ovde ne vidi to kao
ista vise od detinjastog gubljenja vremena i novca.
Mi smo odlucili da sami obezbedimo te stvari - nasli smo mesto na kojem cemo
da odrzimo parti, donecemo svoje kompjutere (mozete i vi da donesete svoje!)
i potrosicemo svoj sopstveni novac na skromne nagrade.
Mozda ste shvatili, citajuci sav ovaj tekst, da ime partija nije sala. Stvarno
ce biti lame. Ali bice prvi jugoslovenski demo parti i deo razloga sto nijedan
nije odrzan do sada je to sto je svako radije birao da uopste ne odrzi parti
nego da odrzi glupi mali lame parti. Kad bismo i mi to uradili, zavrsili bismo
na isti nacin. Verujemo da je bolje imati los parti nego nemati dobar. Ako
posluzi svojoj svrsi, ako probudi ljude ovde, onda nece ni biti toliko lame na
kraju krajeva.
Jos jedan problem koji su imali dosadasnji nesudjeni organizatori ovdasnjih
partija je to sto NIKO NE RADI NISTA u Jugoslaviji. Nismo mi glupi, samo smo
lenji. Verovatno i u svim drugim zemljama 99% ljudi igra svoje igrice od 20
CD-ova, ali tamo ipak postoje demo-sceneri. I ovde, u Jugoslaviji, postoje
ljudi koji sede sa svojim asemblerima i pisu jednostavne male efekte, samo
nikad ne razmisljaju ozbiljno o pravljenju pravih demoa - ne veruju da imaju
sanse da urade ista uporedivo sa remek-delima severno-evropejaca.
To je koren jos jedne ideje iza YALP-a: Kad bi ljudi ovde bili spremni da
prave ozbiljne demoe, takmicili bi se na svetskim (ili evropskim) compoima,
gde bi imali sansu da zarade vise slave i vrednije nagrade nego na nekom lame
malom lokalnom partiju. Ocigledno je da to bas mnogo i ne rade. Dakle, trebalo
bi da se takmice sa drugim lokalnim ljudima u tako maloj skali - 256 bajtova -
taman dovoljno da prikazu neki jednostavan efekat koji su napravili. Nadamo se
da ce posle ovoga ljudi ovde shvatiti da nisu ludi ako trose svoje vreme na
kodiranje "beskorisnih" stvari poput demoa, da takve aktivnosti nisu bezvredne
i da imaju smisla.
-------------------------------------------------------------------------------
Ako imate bilo kakva pitanja ili predloge vezane za parti, ili ako zelite da
nas obavestite o vasim planovima za dolazak, slobodno emajlirajte :) glavnog
organizatora (Han Solo / Vortex) na neku od ovih adresa:
- vladafi@classroom.opennet.org
- mrki@afrodita.rcub.bg.ac.yu
Takodje bismo cenili da prosledite ovaj fajl svima koji bi mogli da budu
zainteresovani.
Hvala vam, i vidimo se u Beogradu u januaru!
organizatori
asembler.259bilder,
Kako bi trebalo da se radi hardverski skrol u modu 12h ALI ako je aktiviran
split screen postavljanjem linecomp registra ?
Naravno ne treba pregaziti sadrzaj od 0a0000h gde se nalazi donji screen !
asembler.260mdimitrijevic,
> Kako bi trebalo da se radi hardverski skrol u modu 12h ALI ako je
> aktiviran split screen postavljanjem linecomp registra ?
> Naravno ne treba pregaziti sadrzaj od 0a0000h gde se nalazi donji screen !
Pokušaću da nađem negde svoj sors koji radi za sve 16 bojne modove.
asembler.261stameni,
>> > Zasto sledeci program ne salje modemu odredjeni string (u
>> > ovom slucaju ATD - videti kraj programa)?
>> Nisam detaljno analizirao program, ali da probam na prvu
>> loptu: probaj da gornju liniju zameniš sa
>> ProcessLine('ATD'+#13).
To je to, sada radi.
asembler.262stameni,
Nije mi jasna razlika između MOVS i MOVSB, pa ako neko zna...
Bye :)
asembler.263bokir,
> Nije mi jasna razlika između MOVS i MOVSB, pa ako neko zna...
Sintaksa: MOVS dest, src
MOVS nije prava asemblerska instrukcija.
Nju asembler prevodi u MOVSB ili u MOVSW, u zavisnosti od
toga da li je 'src' niz bajtova ili wordova.
Pre MOVS, SI i DI registri moraju da budu postavljeni
na 'src' i 'dest'.
Za razliku od ovoga, MOVSB kopira isključivo jedan bajt.
asembler.264banga,
> Nije mi jasna razlika između MOVS i MOVSB, pa ako neko zna...
Pa valjda je u byte-u. Pogledaj u NG :)
asembler.265jexy,
Da li postoji neki fazon da se u pmodu DMA 'natera' da vidi celih 32 bita
a ne samo prvi megabajt ? (znaci ne da prebacujem u prvi megabajt da bih
ostvario DMA transfer vec direktno iz ext. memorije )
asembler.266nenad,
> Da li postoji neki fazon da se u pmodu DMA 'natera' da vidi celih 32 bita
> a ne samo prvi megabajt ? (znaci ne da prebacujem u prvi megabajt da bih
> ostvario DMA transfer vec direktno iz ext. memorije )
Mislim da to nije moguće, ne zbog PMODE-a već zbog arhitekture PC
računara.
Ako grešim, ispraviće me neko ko zna više od mene, ako sam u
pravu - ispraviće me neko ko zna manje od mene. :)
asembler.267jexy,
Nesto sam prelistavao ovu konferenciju i video da se pre odredjenog vremena
ovde vodila krvava diskusija oko toga kako treba uraditi DMA transfer memorije
u istu.Dakle ideja je stvarno odlicna ali da li je neko zaista uspeo da
ostvari takav DMA transfer,ako jeste..
asembler.268stameni,
Evo primera jednog rezidentnog programa. To je mali screen
blanker, koji se posle instaliranja aktivira i deaktivira
uzastopnim pritiscima tastera PrtSc. Nije loše uočiti postupak
kojim se ekran pali/gasi: u pitanju je igranje portovima 03dah i
03c0h (za detalje pogledati techref, recimo). Kako je stvar
prilično niskog nivoa, radi i u grafici (isprobano u 640 * 480).
Ideju za rad dela programa koji instalira rezidentni deo dobio
sam u 1084. "bajtu lične prirode", a za rezidentni deo sam video
negde u "snippets" bibiloteci za C.
Eksperimentišite, menjajte, javljajte!
<----cut---->
; Blankovanje ekrana preko tastera PrtSc
; Asemblirati sa: tasm blank.asm
; Linkovati sa: tlink /t blank.obj
;
.model tiny
.code
org 0100h
start:
mov ax, 02500h + 05h ; Preuzima se interrupt 05h
lea dx, new_int05
int 021h
mov dx, 1 + offset status ; dx = dužina rezidentnog dela
int 027h ; u bajtovima; int 27h je
; Terminate and Stay Resident
; interrupt
new_int05: ; ovde počinje sâm handler
cli
pushf
push ax
push dx
mov ah, byte ptr status
or ah, ah
jz restore ; status je bio 0, pa treba
; prikazati ekran, inače ga
xor ah, ah ; ugasiti (ekran :)
mov byte ptr status, ah
mov dx, 03dah
in al, dx
xor al, al
mov dx, 03c0h
out dx, al
jmp EndHandler ; idi na kraj
restore:
inc ah
mov byte ptr status, ah ; ažurirati status
; a zatim
mov dx, 03dah ; prikazati ekran
in al, dx
mov al, 20h
mov dx, 03c0h
out dx, al
EndHandler:
pop dx
pop ax
popf
sti
iret ; završiti rad handlera
status: db 1 ; handlerova promenljiva; ako
; je status = 1, treba isklju-
; čiti ekran, a ako je status =
; 0, treba ga uključiti
end start
<----cut---->
asembler.269stameni,
>> ; Blankovanje ekrana preko tastera PrtSc
Evo prevedene verzije...
blank.comasembler.270stameni,
Dva pitanja:
Zašto kod Turbo Assemblera (2.01) u ideal modu mora da se
umesto
mov [test], ax
koristi
mov [word ptr test], ax
kad se "lepo vidi" da je u prvom slučaju odredišna adresa 16-bitna
(ax je 16-bitan)?
Sme li se iz interrupt handlera pozivati neki drugi interrupt?
Jesu li prekidi re-entrant?
Okucah, prebrojah i utvrdih da ima zapravo tri pitanja ("... od
vas se traži samo jedno, a to su dve stvari: rad, red i
disciplina...").
asembler.272obren,
> Zasto kod Turbo Assemblera (2.01) u ideal modu mora da se umesto
>
> mov [test], ax
>
> koristi
>
> mov [word ptr test], ax
>
> kad se "lepo vidi" da je u prvom slucaju odredisna adresa 16-bitna
> (ax je 16-bitan)?
Ideal mod jeste nešto zahtevniji po pitanju preciziranja tipa
operanada, ali u ovom konkretnom slučaju to ne bi treblo da je
slučaj. Moguć uzrok problema je (pored bajatog asemblera, nabavi
neku noviju verziju) činjenica da je "test" mnemonik postojeće
instrukcije pa to možda može da pravi problem? Trebao si da
navedeš i kako si definisao "test" u DATASEG-u, možda bi bilo
jasnije u čemu je problem.
> Sme li se iz interrupt handlera pozivati neki drugi interrupt?
Generalno sme, ali uvek može da ima izuzetaka (npr. pozivanje int 21h
iz nekog drugog interapta podleže prethodnij proveri da li je DOS zauzet,
odnosno da li je prekid u kome se nalaziš nastupio upravo u prekidu koga
planiraš da pozoveš - al' ga sročih ;)
> Jesu li prekidi re-entrant?
Opet, sve zavisi od prekida do prekida.
asembler.273stameni,
>> Moguć uzrok problema je (pored bajatog asemblera,
>> nabavi neku noviju verziju) činjenica da je "test" mnemonik
>> postojeće instrukcije pa to možda može da pravi problem?
>> Trebao si da navedeš i kako si definisao "test" u DATASEG-u,
>> možda bi bilo jasnije u čemu je problem.
O:) Labela nije bila "test", to sam ja radio koristeći neku
drugu nisku, pa onda ušao u editor i odradio jedan Search &
Replace zamenjujući originalnu labelu, ne vodeći računa o
mnemonicima. Eh :)
Problem ostaje; evo šta sam maločas napravio (ovaj put import
iz datoteke sa diska):
----<cut>----
ideal
model tiny
codeseg
org 0100h
start:
xor ax, ax
mov [word ptr abcd], ax ; Ovo prolazi, dok
mov [abcd], ax ; ovde izbacuje error (ne warning (?))
; Operand types do not match
; i to i u ideal i u masm modu
mov ax, 4c00h
int 21h
abcd: dw 0, 0
end start
----<cut>----
Dakle, mod je ideal, model tiny, a abcd je promenljiva iz kod
segmenta. Nije u pitanju ni definicija abcd (jednako se ponaša i
sa db i sa dw). Ako neko ima noviji asembler, ne bilo mu teško da
ovo izasemblira...
>> > Jesu li prekidi re-entrant?
>>
>> Opet, sve zavisi od prekida do prekida.
Kratko obrazloženje: radim progamčić koji bi trebalo da odradi
write protection diska (koji se, eventualno, zada), radi čega
pokušavam da handleujem 13h u kome pokušavam da izbacim string uz
pomoć 21h, no nešto ne ide... No, videćemo...
asembler.274obren,
> mov [word ptr abcd], ax ; Ovo prolazi, dok
> mov [abcd], ax ; ovde izbacuje error (ne warning (?))
> ...
> abcd: dw 0, 0
Pa ovako, TASM je jednoprolazni asembler, tako da u trenutku kada si
koristio "abcd" on ne zna da li je word ili byte pa moraš eksplicitno
da mu naglasiš (preko word ptr). Da si "abcd" deklarisao ispred mesta
na kome ga koristiš, asembler bi već znao da se radi o wordu i sve bi
prošlo bez problema.
> Kratko obrazloženje: radim progamčić koji bi trebalo da odradi
> write protection diska (koji se, eventualno, zada), radi čega
> pokušavam da handleujem 13h u kome pokušavam da izbacim string uz
> pomoć 21h, no nešto ne ide... No, videćemo...
Uh, to što si zamislio će malo teže da ide. Preporučujem ti da dobro
proučiš materiju pre nego što počneš da pišeš tako nešto. Radije prvo
probaj da napišeš par "običnih" TSR-programa, dakle onih koji ne diraju
disk servise sve dok ne stekneš malo više iskustva. U protivnom možeš
lako dovesti do korupcije podataka na disku ako se zezaš sa trinaesticom...
asembler.275stameni,
>> > mov [word ptr abcd], ax ; Ovo prolazi, dok
>> > mov [abcd], ax ; ovde izbacuje error (ne warning
>> > (?)) ...
>> > abcd: dw 0, 0
>>
>> Da si "abcd" deklarisao
>> ispred mesta na kome ga koristiš, asembler bi već znao da se
>> radi o wordu i sve bi prošlo bez problema.
Isprobao sam maločas i neće (TASM je 2.01) :(. Je l' kod tebe
prolazi? Ako da, koja je verzija asemblera?
Mislim da nema potrebe praviti problem tamo gde ga nema: ne
smeta meni da kucam byte / word / dword ptr tamo gde neće drukčije
(jeste da malo zbunjuje, ali...). Inače, koliko sam primetio, nije
obavezno stavljati ptr u ideal modu, dok je za masm neophodno.
>> Preporučujem ti da
>> dobro proučiš materiju pre nego što počneš da pišeš tako
>> nešto. Radije prvo probaj da napišeš par "običnih"
>> TSR-programa, dakle onih koji ne diraju disk servise sve dok
>> ne stekneš malo više iskustva.
Odakle da počnem? Imam nekolike helpove koje sam uglavnom
pokupio sa Sezama, ali nisam siguran da je negde baš potpuno
objašnjeno pisanje TSR-programa. Trebalo bi da ima dosta dobrog
teksta u registrovanom DOSREF-u, ali nisam siguran da toga ima kod
nas... Dobro bi mi došao pointer na datoteke koje mogu naći ovde
negde. Ako si mislio na papirnati help, šta konkretno
preporučuješ? Može li se nekako do toga doći?
Smatram sebe početnikom u programiranju, mada sam jedan program
(TSR) nedavno napisao i okačio source ovde negde. Mislio sam da ću
najbolje napredovati na konkretnim zadacima, ali sam se izgleda
precenio :) However, spreman sam da radim na sopstvenom
usavršavanju ;)
>> U protivnom možeš lako dovesti
>> do korupcije podataka na disku ako se zezaš sa trinaesticom...
:) Dobro, privremeno ću ostaviti na stranu trinaesticu, hvala
na upozorenju. Nisam imao pojma da je ona toliko gadna.
asembler.276obren,
> Isprobao sam maločas i neće (TASM je 2.01) :(. Je l' kod tebe
> prolazi? Ako da, koja je verzija asemblera?
Buni se zato što si 'abcd' obeležavao kao labelu, odnosno što si stavio
dvotačku posle 'abcd'. Sledeći primer lepo prođe (TASM 3.1):
ideal
model tiny
codeseg
org 0100h
start: jmp begin
abcd dw ? ; možeš i dw 0
begin: xor ax, ax
mov [abcd], ax
mov ax, 4c00h
int 21h
end start
> Odakle da počnem? Imam nekolike helpove koje sam uglavnom
> pokupio sa Sezama, ali nisam siguran da je negde baš potpuno
> objašnjeno pisanje TSR-programa.
1) Pogledaj na primer TECHREF, HELPPC i Ralph Brown-ovu listu interapta
mada je ova zadnja prilično prenatrpana svim i svačim što je čini
pomalo teškom za snalaženje. Pogledaj dos funkciju 34h, poglavlje o TSR
programima u TechRef-u, interapt 28h, pročitaj šta je to Disk Transfer
Area pošto već hoćeš da radiš sa diskom.
2) Ako imaš kolekciju starih brojeva "Računara", potraži (odlične) članke
Zorana Životića i mislim Bojana Petrovića na temu rezidentnih programa.
3) Probaj da iz dibagera ili Sourcera analiziraš tuđe programe (pa i
viruse ;) i tako skidaš "cake".
Ipak, kad malo bolje poledaš, danas je već prilično deplasirano baktati
se sa tim stvarima pošto je DOS a samim tim i TSR programi polako otišao
u zasluženu penziju. Sa druge strane, sistemsko programiranje je jedna
jako zanimljiva stvar, i nikako ne može da šteti ako upoznaš dušu svoje
mašine pre nego što pređeš na Javu, Delphi i ostale bildere ;)
asembler.277nethsah,
treba mi neki dobar assembler...
asembler.278stameni,
>> Buni se zato što si 'abcd' obeležavao kao labelu, odnosno što
>> si stavio dvotačku posle 'abcd'. Sledeći primer lepo prođe
>> (TASM 3.1):
E, u dvotački je bila stvar! :) Nisam znao da to može praviti
probleme, hvala na savetu! Sad radi k'o satić.
>> Sa druge
>> strane, sistemsko programiranje je jedna jako zanimljiva
>> stvar, i nikako ne može da šteti ako upoznaš dušu svoje mašine
>> pre nego što pređeš na Javu, Delphi i ostale bildere ;)
Nego šta, zato se i petljam time :) Hvala za info i pointere, a
kad naletim na problem, eto mene opet ovde :) Takođe, eto mene
ovde ako naiđem na nešto interesantno.
asembler.279stameni,
>> treba mi neki dobar assembler...
Probaj a86, dobar je i košta džabe ;) te ga ima i u dir-u.
asembler.280nethsah,
haval za savet...
asembler.281mdimitrijevic,
> Pa ovako, TASM je jednoprolazni asembler, tako da u trenutku kada si
> koristio "abcd" on ne zna da li je word ili byte pa moraš eksplicitno
> da mu naglasiš (preko word ptr). Da si "abcd" deklarisao ispred mesta
> na kome ga koristiš, asembler bi već znao da se radi o wordu i sve bi
> prošlo bez problema.
Tasm jeste jednoprolazni asembler, ali mu se može narediti da prođe
kroz kod više puta. To se određuje direktivom /M<broj prolaza>. Recimo /M9 za
devet prolaza kroz kod.
>> pokušavam da handleujem 13h u kome pokušavam da izbacim string uz
>> pomoć 21h, no nešto ne ide... No, videćemo...
Zašto string ne ispišeš preko INT 10h. On ima nekoliko rutina koje
mogu sasvim lepo da ispišu string, ili da ideš na to da string ispišeš slovo
po slovo (preko INT 10h) zbog kompatibilnosti sa svim, pa i XT računarima.
asembler.282stameni,
>> Zašto string ne ispišeš preko INT 10h. On ima nekoliko rutina
>> koje mogu sasvim lepo da ispišu string, ili da ideš na to da
>> string ispišeš slovo po slovo (preko INT 10h) zbog
>> kompatibilnosti sa svim, pa i XT računarima.
Pitanje je bilo postavljeno meni. Nisam se bio setio da može
preko BIOS-a. Pogled u Interrupt Lists otkriva da je u pitanju
funkcija 13h (a verovatno može i na nekoliko drugih načina, od
kojih je jedan slovo po slovo, kao što si rekao).
Nisam siguran da bi pisanje preko int 10h rešilo neke probleme
u vezi sa pozivanjem int 21h iz handlera int 13h.
asembler.283jexy,
;; >> treba mi neki dobar assembler...
;;
;; Probaj a86, dobar je i kosta dzabe ;) te ga ima i u dir-u.
Zasto da uzima truo asembler, vec lepo ne uzme Tasm v4.0 koji je inace
nesto skuplji a mnoogo bolji.Kod lokalnog pirata kosta cela 2 dinara druze :)
asembler.284jexy,
;; Nisam siguran da bi pisanje preko int 10h resilo neke probleme
;; u vezi sa pozivanjem int 21h iz handlera int 13h.
Ako hoces da zoves int 21h iz TSR-a, moras da preuzmes i sam 21h koji
postavlja neke tvoje promeljive o zauzetosti DOS-a.Na osnovu njih mozes da
vidis da li je int 21h slobodan ili ne.Ovo me je podsetilo kako smo razbili
sistem u skoli :).Naime napravili smo mali TSR koji hvata tastere preko int 9h
a trpa ih u neki bafer, a preko int 8h,13h,21h smo kontrolisali upis bafera u
odredjeni fajl.Kako niko nista nije posumnjao uskoro smo dobili sifru
supervisor-a O:).
BTW, Sva eksperimentsanja ovog tipa izbegavaj da radis kod kuce.Sve sto smo
uradili napravljeno je u skoli.
asembler.285mdimitrijevic,
> Nisam siguran da bi pisanje preko int 10h rešilo neke probleme
> u vezi sa pozivanjem int 21h iz handlera int 13h.
Izgleda da se ne razumemo (?). Ako pišeš preko Int 10h onda ti ne treba
pozivanje Int 21h. Ne vidim gde je problem. Ukoliko sve uradiš preko Int 10h,
i ukoliko preuzmeš Int 13h, koji je uzgred prilično rizičan za preuzimanje,
onda samo proveravaš da li je pokušaj pristupanja (čitanja) diska zabranjen i
ako jeste vratiš grešku. E sad, ispisivanje poruke o zabrani pisanja bi morao
da odradiš jedino ako je računar u tekst modu, mada može i ako je u grafičkom
modu ali je to malo komplikovanije i povećava sam kod programa koji bi trebalo
da bude što manji.
Pokušaj da napraviš neku osnovu, kasnije je mnogo lakše nadograđivati
program. I jedan dobronameran savet, ukoliko nisi previše siguran u to što
radi Int 13h, piši program na tuđem računaru :)
asembler.286stameni,
>> > Nisam siguran da bi pisanje preko int 10h rešilo neke
>> > probleme u vezi sa pozivanjem int 21h iz handlera int 13h.
>>
>> Izgleda da se ne razumemo (?). Ako pišeš preko Int 10h onda ti
>> ne treba pozivanje Int 21h. Ne vidim gde je problem.
Iskreno, nije mi baš najjasnije šta sam tim gore hteo da kažem
O:) Ako se ne varam, mislio sam da ispisivanje i može da ide preko
int 10h, ali ostaje problem oko (potencijalnog; isprobao sam
kasnije a nemam pojma jesam li o neuspehu ovde pisao) poziva int
21h radi "nečega", jer je int 21h potreban za get / set interrupt
vector. Valjda.
>> Pokušaj da napraviš neku osnovu, kasnije je mnogo lakše
>> nadograđivati program.
Urađeno i source sa komentarima (custom2) okačen uz poruku.
Pokušao sam da ga modifikujem da preuzme int 26h (zbog saveta koji
si mi dole naveo, a koji sam takođe dobio od Obrena), misleći da
ga možda pozivaju ostali intovi. Pogrešno sam mislio. A da ga je
bilo lako napisati prepravljanjem sourcea "starog" programa --
bilo je.
>> I jedan dobronameran savet, ukoliko
>> nisi previše siguran u to što radi Int 13h, piši program na
>> tuđem računaru :)
Odustajem od int 13h :) dok se ne usavršim. :)
wpr.asmasembler.287mdimitrijevic,
> Iskreno, nije mi baš najjasnije šta sam tim gore hteo da kažem
> O:) Ako se ne varam, mislio sam da ispisivanje i može da ide preko
> int 10h, ali ostaje problem oko (potencijalnog; isprobao sam
> kasnije a nemam pojma jesam li o neuspehu ovde pisao) poziva int
> 21h radi "nečega", jer je int 21h potreban za get / set interrupt
> vector. Valjda.
Ukratko, ti pozivaš Int 21h za get/set int vector PRE nego što
program postane rezidentan ! Pošto se postavi potrebni interapt vektor
Int 21h se ne mora i ne treba pozivati, jer će doći do blokiranja i
kojekakvih problema.
Na kraju krajeva moguće je postaviti svoj interapt vektor i bez
Int 21h, prostim direktnim čitanjem i upisom u Vector tabelu.
> Urađeno i source sa komentarima (custom2) okačen uz poruku.
> Pokušao sam da ga modifikujem da preuzme int 26h (zbog saveta koji
> si mi dole naveo, a koji sam takođe dobio od Obrena), misleći da
> ga možda pozivaju ostali intovi. Pogrešno sam mislio. A da ga je
> bilo lako napisati prepravljanjem sourcea "starog" programa --
> bilo je.
Kod ovakvog programa dobro je obezbediti se od mogućih "pogrešnih
podataka", jer ukoliko se umesto na određeno mesto, nešto upiše na neko drugo
može doći do velikih problema. Int 13h piše direktno na disk tako da možeš
uništiti bukvalno sve na disku upisom u BOOT sektor, FAT tabelu itd.
Između ostalog potrebno je kontrolisati sve pozive Int 13h i
proveravati da li se pokušava bilo kakvo čitanje, pisanje ili preuzimanje
informacija o "zaštićenom disku".
Evo recimo jedne prostije ideje za zaštitu, sa kojom na kraju krajeva
može da se napravi manje problema :). Napisati program koji sprečava prelazak/
promenu direktorijuma na neki unapred zadati. Što će reći na svaki pokušaj
CD C:\PROBA da odbije da uđe u njega. Ajde da vidimo imaš li neku ideju kako
ovo da uradiš.
Rado ću ti pomoći da ovo napišeš, ali prvo očekujem da dođeš bar do
početne ideje, tj. šta bi trebalo koristiti za izradu programa (koji Int itd.).
asembler.288stameni,
>> Napisati program koji
>> sprečava prelazak/ promenu direktorijuma na neki unapred
>> zadati. Što će reći na svaki pokušaj CD C:\PROBA da odbije da
>> uđe u njega.
Ahm, dakle imam i domaći zadatak? :) Okay, jedna verzija
programa, koja ne radi iz meni nepoznatih razloga, je okačena uz
poruku, a ideja je opisana malo dole.
>> Pošto se postavi potrebni
>> interapt vektor Int 21h se ne mora i ne treba pozivati, jer će
>> doći do blokiranja i kojekakvih problema.
A šta ako mi je potrebna neka funkcija interrupta 21h koja nije
Set Interrupt Vector? Pitam zato što mi na preuzimanje interrupta
21h u domaćem zadatku Turbo Debugger 2.01 redovno resetuje
računar. :(
>> Na kraju krajeva moguće je postaviti svoj interapt vektor i
>> bez Int 21h, prostim direktnim čitanjem i upisom u Vector
>> tabelu.
Inače, koliko je ovo "bezbedna" metoda? Mislim da je u redu kad
je u pitanju int 21h, jer poziv njemu ne bi trebalo da može da se
desi ako je upisana, recimo, samo jedna reč vektora. Problem bi
mogao da nastane kod hardverskih prekida, ako nije kompletiran
pointer na interrupt.
Evo i algoritma za domaći ;) Ideja je da se preuzme 21h i
handleuje funkcija 3bh, Set Current Directory. Prema "Svim MS DOS
funkcijama" (umetak iz nekih "Računara" od Zorana Životića) ta
funkcija realizuje internu DOS naredbu chdir. String koji se
šalje funkciji nalazi se na adresi DS:DX, i on se upoređuje sa
onim koji korisnik zada. Ako su jednaki, sprečava se prelazak u
direktorijum.
Moguć problem je da string koji se prosleđuje funkciji 3bh nije
"expandovan", odnosno da se, na primer, na sledećoj poziciji:
C:\PROBA> cd test
C:\PROBA\TEST>
funkciji prosleđuje smao string "TEST", a ne i "C:\PROBA\TEST". To
već ne bih umeo da rešim bez rekurzivnog pozivanja, što mi se baš
i ne radi, ako može da se izbegne :)
Detaljniji opis algoritma sledi, pa koga interesuje neka čita.
Koga baš mnogo interesuje neka skine i komentarisan source
programa... koji, istina, još ne radi O:)
Prvo se preko interrupta 21h funkcija 35h sačuva pokazivač na
originalan 21h. Zatim se taj pokazivač postavi na sâm handler, pa
se završava "loader". Od tog trenutka trebalo bi da radi samo
handler. Handler ispituje je li upao poziv funkcije 3bh. Ako nije,
skače se na stari interrupt 21h, da bi se odradile ostale
funkcije. Ako jeste, bajt po bajt se porede string koji je ušao u
handler na DS:DX i onaj kome treba da bude onemogućeno ulaženje;
uzeo sam da se ovaj drugi završava nulom. Ako se došlo do nule,
znači da su svi ostali znakovi jednaki (*), pa treba onemogućiti
promenu u taj direktorijum. Ako pre nule bude nekih različitosti,
prelazi se na kraj handlera (**), inače se preko interrupta 10h
(funkcija 13h) ispisuje poruka o grešci i završava rad handlera.
Bugovi koji su mi pali na pamet u toku kucanja ovog teksta:
(*) Ne prelazi se u direktorijum ako je ime datog direktorijuma
deo imena direktorijuma unesenog u handler, jer je dati null-
terminated, a uneti ima iza nule prvog još nekoliko znakova.
Veliki problem.
(**) Treba da se pređe ne na kraj handlera, nego na stari 21h, da
bi se odradila komanda cd. Mali problem.
Najveći problem je što mi Turbo Debugger (2.01) redovno
resetuje računar čim pokuša da odradi Set Interrupt Vector. Nemam
pojma što se to dešava.
Da li valja ideja, bar? :)
nocd.asmasembler.289mdimitrijevic,
Izvinjavam se na dužini poruke, ali oni koji prate ovu TEMU će
u svakom slučaju biti zainteresovani da ovo pogledaju.
Prilazem NOCD.ASM koji radi pod cistim DOS-om. Program je mogao i
bolje da se napise ali je ovo samo primer. Ako se mozda provukla neka greska
onda je to zato sto sam ga napisao na brzinu.
Važna napomena je da sve ovo ovde izneto NE RADI pod 4DOS-om, on malo
drugačije postavlja aktivni direktorijum.
> Ahm, dakle imam i domaći zadatak? :) Okay, jedna verzija
> programa, koja ne radi iz meni nepoznatih razloga, je okačena uz
> poruku, a ideja je opisana malo dole.
Razloge zašto primer koji si poslao ne radi ćeš otkriti kasnije
u poruci. Ali, glavni razlog je što je skoro sve pogrešno napisano :)
> A šta ako mi je potrebna neka funkcija interrupta 21h koja nije
> Set Interrupt Vector? Pitam zato što mi na preuzimanje interrupta
> 21h u domaćem zadatku Turbo Debugger 2.01 redovno resetuje
> računar. :(
Ukoliko iz interapta želiš da pozivaš funkcije Int 21h moraš da
preuzmeš i njega, onda da pratiš da li je DOS slobodan (recimo ako bi hteo
nešto da snimaš u fajl itd.), pa da radiš ono što si naumio. Da bi uradio
nešto ovako komplikovano moraš dobro da paziš na registre, flag-ove, stek
i sve ostalo :)
Turbo Debugger ti resetuje računar zato što je kod koji predstavlja
novi Int 21h pogrešno napisan, totalno pobrljavi i dolazi do boga pitaj
čega u memoriji.
> Inače, koliko je ovo "bezbedna" metoda? Mislim da je u redu kad
> je u pitanju int 21h, jer poziv njemu ne bi trebalo da može da se
> desi ako je upisana, recimo, samo jedna reč vektora. Problem bi
> mogao da nastane kod hardverskih prekida, ako nije kompletiran
> pointer na interrupt.
Kako misliš da Int 21h postavlja interapt vektor ? I on mora da ga
upiše u Vektor tabelu isto kao što bi to i mi uradili. Morali bi da maskiramo
interapte i upišemo u Vektor tabelu.
> Evo i algoritma za domaći ;) Ideja je da se preuzme 21h i
> handleuje funkcija 3bh, Set Current Directory. Prema "Svim MS DOS
Baš tako.
> Moguć problem je da string koji se prosleđuje funkciji 3bh nije
> "expandovan", odnosno da se, na primer, na sledećoj poziciji:
> C:\PROBA> cd test
> C:\PROBA\TEST>
> funkciji prosleđuje smao string "TEST", a ne i "C:\PROBA\TEST". To
> već ne bih umeo da rešim bez rekurzivnog pozivanja, što mi se baš
> i ne radi, ako može da se izbegne :)
Postoji "nedokumentovana" funkcija 60h koja od skraćene putanje
vraća punu putanju do direktorijuma, fajla itd. Ovaj problem bi rešavao tako
što preuzmeš trenutno aktivni direktorijum i na njega nakalemiš ono što ti je
prosleđeno. Ako je aktivni direktorijum C:\PROBA a braniš ulazak u
C:\PROBA\TEST, onda ako dobiješ ime direktorijuma koje nema C:\ napred, a
aktivni disk je C onda dodaješ TEST na C:\PROBA\ i onda testiraš. Shvataš,
načIn ? Naravno, ima tu nekoliko varijacija na temu.
> (*) Ne prelazi se u direktorijum ako je ime datog direktorijuma
> deo imena direktorijuma unesenog u handler, jer je dati null-
> terminated, a uneti ima iza nule prvog još nekoliko znakova.
> Veliki problem.
> (**) Treba da se pređe ne na kraj handlera, nego na stari 21h, da
> bi se odradila komanda cd. Mali problem.
Moja ideja je da (za prvu *) ne treba dozvoliti ulazak ni u
poddirektorijume direktorijuma koji štitimo. Ali ako želiš da ga pustiš unutra
onda prvo prebrojiš koliko znakova ima direktorijum u koji se prelazi pa ako
prelazi broj znakova direktorijuma koji štitimo onda ga prekačemo.
> Da li valja ideja, bar? :)
Ideja valja.
Sada mala analiza koda NOCD.ASM:
Ne smeš tek tako da šalješ na stek jer ako pozivni program ima mali
stek onda nastade sr*nje. Ili upišeš sadržaje registara u memoriju ili postaviš
svoj stek.
push ax
push bx
push cx
push es
push bp
Ubacio si u BX ofset labele DISABLED umesto ofset od STRING. Onda,
porediš preko AX (16-bitno) u redu ako je dužina putanje koju štitiš parna,
ako nije porediće se jedan bajt koji može biti različit (i biće u 99.999...99%
slučajeva).
Onda ako putanje nisu jednake skačeš na END_HANDLER a nisi skinuo sa
steka AX, BX, CX, ES, BP. Da ne pominjem da ako direktorijum nije taj koji
tražimo onda se blokira ceo računar.
Int 10h si pogrešno pozvao, zaboravio si da postaviš BH,BL,DH,DL,AH,AL
tj. BH=video strana, BL=atribut, DH=red, DL=kolona na ekranu (ili obrnuto),
AH=13h, AL=1 (ispis znakova uz pomeranje kursora).
; ds:dx pokazuje na početak imena
; direktorijuma u koji se pokušava ulaz
mov bx, offset disabled ; što se upoređuje sa stringom disabled
mov bp, dx
loop1: mov ax, [cs:bx]
or ax, ax ; Kraj stringa?
jz disabled ; Da, stringovi su jednaki
cmp ax, [ds:bp] ; Poređenje pojedinačnih slova
jnz end_handler ; Stringovi su različiti
inc bx ; Sledeće slovo prvog stringa
inc bp ; Sledeće slovo drugog stringa
jmp loop1 ; Nazad u petlju
; Prethodni redovi su mogli i uz rep scasb, da je poznata
; dužina imena direktorijuma u koji treba zabraniti ulazak
disabled:
mov ax, 13h ; Ispis poruke preko int 10h
mov cx, [len]
push cs
pop es
mov bp, offset tekst
int 10h
pop bp ; Vratiti registre sa stacka
pop es
pop cx
pop bx
pop ax
end_handler: popf
iret ; Povratak iz handlera
nocd.asmasembler.290stameni,
>> Važna napomena je da sve ovo ovde izneto NE RADI pod 4DOS-om,
>> on malo drugačije postavlja aktivni direktorijum.
Činjenica da ovo do sada nisam znao mi u poslednje vreme
komplikuje život.. :(
>> Postoji "nedokumentovana" funkcija 60h koja od skraćene
>> putanje vraća punu putanju do direktorijuma, fajla itd.
Valja upamtiti, nisam znao. Može se proveriti i u Interrupt
Lists i DosRef, što sam i uradio, i, interesantno, ne piše da je
nedokumentovano, što znači da se može 'ladno koristiti.
>> Ovaj
>> problem bi rešavao tako što preuzmeš trenutno aktivni
>> direktorijum i na njega nakalemiš ono što ti je prosleđeno.
>> Ako je aktivni direktorijum C:\PROBA a braniš ulazak u
>> C:\PROBA\TEST, onda ako dobiješ ime direktorijuma koje nema
>> C:\ napred, a aktivni disk je C onda dodaješ TEST na C:\PROBA\
>> i onda testiraš. Shvataš, načIn ?
Shvatam otprilike, samo što se petljati ovako kad postoji
funkcija 60h? Mislim, preko 60h se dobije adresa (segment:offset)
stringa koji se pokušava uneti i on se uporedi sa onim koji je
zabranjen, itd. Odnosno, recimo da je zabranjen C:\PROBA\TEST.
Pokušava se unos direktorijuma TEST. F-ja 60h vrati da je TEST u
punom obliku C:\PROBA\TEST, ta dva se uporede i, kako su jednaki,
zabranjuje se promena direktorijuma.
Nadam se da nema zabune ako kažem da sam smatrao da je
direktorijum C:\PROBA\TEST zaštićen (drukčije ime nego u postavci
zadatka)?
>> > (*) Ne prelazi se u direktorijum ako je ime datog
>> > direktorijuma deo imena direktorijuma unesenog u handler,
>> > jer je dati null- terminated, a uneti ima iza nule
>> > prvog još nekoliko znakova. Veliki problem.
>> Moja ideja je da (za prvu *) ne treba dozvoliti ulazak ni u
>> poddirektorijume direktorijuma koji štitimo. Ali ako želiš da
>> ga pustiš unutra onda prvo prebrojiš koliko znakova ima
>> direktorijum u koji se prelazi pa ako prelazi broj znakova
>> direktorijuma koji štitimo onda ga prekačemo.
Mislim da se ovde nismo do kraja razumeli. U redu je da su i
poddirektorijumi zaštićeni. Šta, međutim, ako nuli iz imena
(odnosno na kraju imena) "zabranjenog" ;) direktorijuma odgovara
neki smisleni znak kod onog drugog stringa? Nisi o tome vodio
računa, no nije strašno.
Evo o čemu se radi. Zabranjen je C:\PROBA\TEST i na kraju je
stavljena 0. Pokušaj CD C:\PROBA\TE će biti ispravno shvaćen, i,
ako taj direktorijum postoji, u njega će se preći; u redu. Ako se
pokuša CD C:\PROBA\TEST2, biće ispitano da li je došlo do nule u
prvom stringu, i ako jeste neće ni biti ispitivano dalje, odnosno
kompjuter će misliti da su stringovi jednaki i zabraniće promenu
direktorijuma. Na to sam mislio kod prve (*). Valjda je to jedini
propust koji sam uočio u tvom programu.
(...)
petlja:
mov al, byte ptr cs:[bx]
or al,al
jz ZABRANI
cmp al, byte ptr ds:[bp]
jne izadji
inc bx
inc bp
jmp petlja
ZABRANI:
mov ah, 13h ; Ispis poruke preko int 10h
(...)
Ideja je da se prvo porede dužine imena direktorijuma, što nije
problem za onaj koji se zada, nego za onaj u koji se pokuša
prelaz. Da li je string koji vraća 60h nečim "terminisan"?
>> Ne smeš tek tako da šalješ na stek jer ako pozivni program ima
>> mali stek onda nastade sr*nje. Ili upišeš sadržaje registara u
>> memoriju ili postaviš svoj stek.
Ovo je primer neiskustva. Al' dobro sad...
>> Ubacio si u BX ofset labele DISABLED umesto ofset od STRING.
>> Onda ako putanje nisu jednake skačeš na END_HANDLER a nisi
>> skinuo sa steka AX, BX, CX, ES, BP.
Primer nekoncentracije. Da sam bio u prilici da pregledam
debuggerom, primetio bih to.
>> Int 10h si pogrešno pozvao, zaboravio si da postaviš
>> BH,BL,DH,DL,AH,AL
Za ovaj propust već nemam opravdanje. Imao sam glupu ideju da
će ostali registri biti postavljeni po defaultu. GREŠKA TEŠKA.
Vrlo dobro. Mislim da sam prilično naučio na ovom primerčiću.
Hvala na uputstvima i sourceu problema.
Zakeranje za kraj: iz probnog perioda ti je zaostala
promenljiva (labela) len, koju si deklarisao, a ne koristiš je.
cu :)
asembler.291mdimitrijevic,
>>> Važna napomena je da sve ovo ovde izneto NE RADI pod 4DOS-om,
>>> on malo drugačije postavlja aktivni direktorijum.
>
> Činjenica da ovo do sada nisam znao mi u poslednje vreme
> komplikuje život.. :(
Ne samo podešavanje aktivnog direktorijuma :( već i mnoge druge
stvari (kojih sada ne mogu da se setim, davno sam radio te primere) ne rade
kao pod običnim DOS-om.
>>> Postoji "nedokumentovana" funkcija 60h koja od skraćene
>>> putanje vraća punu putanju do direktorijuma, fajla itd.
>
> Valja upamtiti, nisam znao. Može se proveriti i u Interrupt
> Lists i DosRef, što sam i uradio, i, interesantno, ne piše da je
> nedokumentovano, što znači da se može 'ladno koristiti.
Veruj da je nedokumentovana. A čim se to kaže onda znači da sledeće
verzije DOS-a možda neće isto raditi sa tom funkcijom. Mada, pisao sam programe
za potpuni pregled sistemskih informacija (možeš ga naći na Sezamu, potraži ga
sa DIR MDINFO*.* /S /A) računara koji su koristili moge "nedokumentovane"
pozive i do sada nije zapelo, a dobro je istestirano. U njemu imaš poprilično
informacija vezanih za DOS i ostali softver i hardver.
> Shvatam otprilike, samo što se petljati ovako kad postoji
> funkcija 60h? Mislim, preko 60h se dobije adresa (segment:offset)
> stringa koji se pokušava uneti i on se uporedi sa onim koji je
> zabranjen, itd. Odnosno, recimo da je zabranjen C:\PROBA\TEST.
> Pokušava se unos direktorijuma TEST. F-ja 60h vrati da je TEST u
> punom obliku C:\PROBA\TEST, ta dva se uporede i, kako su jednaki,
> zabranjuje se promena direktorijuma.
> Nadam se da nema zabune ako kažem da sam smatrao da je
> direktorijum C:\PROBA\TEST zaštićen (drukčije ime nego u postavci
> zadatka)?
> Mislim da se ovde nismo do kraja razumeli. U redu je da su i
> poddirektorijumi zaštićeni. Šta, međutim, ako nuli iz imena
> (odnosno na kraju imena) "zabranjenog" ;) direktorijuma odgovara
> neki smisleni znak kod onog drugog stringa? Nisi o tome vodio
> računa, no nije strašno.
Naravno, složili smo se još na početku da ovo nije savršeno rešenje.
Evo, pokušaj da uradiš ovaj primer još bolje, čisto zbpg vežbe.
> Primer nekoncentracije. Da sam bio u prilici da pregledam
> debuggerom, primetio bih to.
Kad već pomenu debugger, ako si pokušao sa Turbo Debugger-om da prođeš
kroz ovaj rezidentni primer video si da onda uopšte ne radi !!! Napišeš mali
ASM sors koji samo poziva funkciju 3Bh da promeni aktivni direktorijum, i
stepuješ kroz interapt 21h (naravno pre toga startuj NOCD). Primetićeš da se
vrednosti registara na početku UOPŠTE ne upisuju u memoriju !!! Ovo je
očigledno veliki BUG Turbo Debugger-a.
> Vrlo dobro. Mislim da sam prilično naučio na ovom primerčiću.
> Hvala na uputstvima i sourceu problema.
Nema problema. Uvek mi je zadovoljstvo da pomognem kad imam vremena.
> Zakeranje za kraj: iz probnog perioda ti je zaostala
> promenljiva (labela) len, koju si deklarisao, a ne koristiš je.
Šta da kažem, kriv sam :) Pokrivam se ušima.
asembler.292lepiaf,
Hi!
Molim vas ako neko zna da mi pomogne. Problem je: potrebno mi je da
oznacim izvesni sektor na disketi (ne na HD-u) kao los, i stoga, da ga
napravim neupotrebljivim za citanje. Kako to mogu da uradim? Problem je
prilicno hitan...
Unapred hvala
pozdrav
asembler.293bokir,
> Molim vas ako neko zna da mi pomogne. Problem je: potrebno mi je da
> oznacim izvesni sektor na disketi (ne na HD-u) kao los, i stoga, da ga
> napravim neupotrebljivim za citanje. Kako to mogu da uradim? Problem je
> prilicno hitan...
Ako imaš Norton Utilities, program DiskTools ima kao jednu od
opcija markiranje sektora na disketama.
asembler.294bokir,
Treba mi bilo kakav info o programiranju VESA 2.0. Čuo sam da može
mnogo da ubrza rad sa grafikom i da ima podršku za protected mod.
Interesuje me kako sve to iskoristiti...
asembler.295jjerry,
Eeej,ljudi, da li neko,slucajno, ima ideju kako se prave interapt
hendleri i,na kraju krajeva, sta su.Inace treba mi za prepoznavanje
SB-a. Kaze ovako: ako je potpis ma ofsetu 103h interapt hendlera
"SBSIM" onda je taj SBSIM instaliran.(SBSIM-Sound Blaster
simplified interface ) Evo vam info pa ako ima neko neke ideje ,bio
bih mu zahvalan. :)
asembler.296stameni,
>> Eeej,ljudi, da li neko,slucajno, ima ideju kako se prave
>> interapt hendleri i,na kraju krajeva, sta su.
Pitanje je previše uopšteno, pa nisam siguran da li ću pogoditi
ono što tebi treba.
Postoje dve vrste (uopšteno) interaptova -- hardverski i
softverski. Hardverske izaziva hardver računara, a softverski su
uglavnom u stvari način da se brzo i uz malo memorije pozivaju
funkcije OS-ova i drugog softvera. Interaptova ukupno može biti do
256 i označeni su brojevima 0-255 (tj. 00-ffh). Pozicija u
memoriji svakog interapta određena je tabelom koja se nalazi u
prvom kilobajtu memorije (0000:0000-0000:03ffh); za svaki se
koristi po 4 bajta, dva za segment a dva za ofset.
Interapt hendler je program koji se upiše negde u memoriju, a
zatim izmeni podatke u tabeli prekida tako da pokazuju na njega.
Od trenutka kad se izmeni tabela prekida, hendler je dužan da vodi
računa o tome da odradi i ono što ima sam da odradi i ono što je
stari interapt trebalo da odradi. Da bi to bilo uspešno,
neophodno je da se sačuvaju registri mikroprocesora na početku
rada handlera u nekoj strukturi (stek, deo memorije...), i da se
sa te strukture vrate registri pri završetku rada hendlera.
Ako želiš da se detaljnije posvetiš ovoj inače veoma
interesantnoj (i nezahvalnoj za rad u današnje vreme) temi, prouči
Interrupt Lists Ralfa Brauna, DosRef, HelpPC, kao i sve što možeš
da nađeš na Sezamu. Pogledaj ovu temu dvadesetak poruka unazad,
bilo je nekoliko primera interapt hendlera. Nikad nisam
programirao SB, pa ne mogu da ti konkretno odgovorim na pitanje.
Uz poruku je primer INT 9 hendlera, prema "Bajtu lične prirode
1085" iz "Računara 120", odakle može puno toga da se nauči. Autor
je Boris (biber@sezam).
Puno resetovanja :) i puno uspeha!
int09.asmasembler.297jjerry,
Prvo 10X za one fajlove i sve one podatke,al' ipak,trebace mi dosta
vremena dok to malo ukacim i sve to.
Dakle Thanks anyway i Pozdrav !
asembler.298biber,
> Kaze ovako: ako je potpis ma ofsetu 103h interapt hendlera "SBSIM" onda je
> taj SBSIM instaliran
Otprilike ovako:
mov ah,35h
mov al,interupt_vector_number
int 21
; time si dobio adresu "interapt hendlera"
; (registri ES:BX)
es:
mov ax,[bx+offset] ; dodaješ taj ofset od 103h
mov cx,[bx+offset+2]
mov dl,[bx+offset+4]
cmp ax,"BS"
jne nije_instaliran
cmp cx,"IS"
jne nije_instaliran
cmp dl,"M"
jne nije_instaliran
;ako je stigao doovde onda je instaliran
Možda se potkrala neka greška, jer pišem dok sam na vezi, ali
je principski to to.
asembler.299biber,
Ima li neko dokumentaciju za programiranje SVGA kartica
kompatabilnih sa VESA standardom?
Konkretno, treba mi 320x200 u hi i true color modovima.
asembler.300jexy,
;;
;; Ima li neko dokumentaciju za programiranje SVGA kartica
;; kompatabilnih sa VESA standardom?
;;
;; Konkretno, treba mi 320x200 u hi i true color modovima.
Pretpostavljam de je skoro sve od rutina sto ti je potrebno jeste setovanje
moda,promena 'banke' i eventualno postavljanje pocetne adrese ispisa ili nesto
u
tom fazonu. Najbolje resenje je da koristis VBE 2.0 mada saljem dokumentacije
za
VBE 1.2 kao i VBE 2.0 pa ti vidi.
vbespec.zipasembler.301sasab,
Zna li neko kako da izvučem serijski broj biosa (valjda je to)?
Mislim na onu kobasicu od dvadesetak cifara koja se ispisuje na dnu
ekrana pri butovanju. "Podizvođač" sam na nekom programu, a glavni
insistira na zaštiti preko ovog broja.
Bogi
asembler.302tomcat,
Zdravo,
mucim se zadnja dva dana da napravim TSR (kostur je u paskalu) koji
radi bi trebeo da radi sledecu (prostu) stvar:
nakachi se na INT 9 i za svaki pritisnuti taster na tastaturi on
podmetne svoj (npr. iz nekog stringa ili citanjem iz text. datoteke)
Ono sto mi ne polazi za rukom je da nateram masinu da ignorise
pritisnuti karakter. Pretpostavljam da to nije veliki problem,
mozda samo manipulacija head&tail-om keyboard buffera ali mi nikako
ne polazi za rukom. Nadam se da neko zna da resi ovaj problem.
Unzpred sam zahvalan za pomoc.
Vlada.
asembler.303jjerry,
Nisam bas siguran,ali znam da uradim par stvari preko DOSovog
interapta,da izvucem koji je sve hardver u masini,razne statuse ,pa
i neke ID bajtove.Ako ti to moze pomoci,poslacu ti ili ovde ili na
mail pa ti reci.
Pozdrav !
asembler.304tomcat,
Zdravo svima!
(dodato kasnije :) - posto ne znam da li ce svi imati strpljenja
da procitaju sve, jedno pitanje - koji je najbrzi algoritam da
ustanovim sah-poziciju na sahovskoj tabli?)
Pre neko vreme sam iskopao odnekud moj program za igranje saha
koji sam poceo da pisem pre par godina na Amigi 500. Posto sam
koristio metod "grube sile", sve je bilo jako sporo. Sada kada sam
ga iskompajlirao na PC-ju (6x86@120Mhz) ispostavio sam da moze da
gura do 6 polu-poteza unapred uz razumno cekanje (1 min). Pa sam
odlucio da celu stvar optimizujem. Optimizacija je moja omiljena
rec :) Program je pisan u paskalu i kompajliram ga TurboPascalom
7.0. Pitam se da li uopste postoji neki drugi kompajler, posto je
ovaj jako star i ne generise 32-bitni kod.
Sada cu izneti dve procedure koje su mi time-kriticne i koje sam
prepravio u asembleru te bih molio da ako neko vidi nacin da se to
napise bolje, neka odmah javi ! :)
1)
procedure add(var lm:moves;var tp:integer;x,y,x1,y1:integer);
begin
lm[tp,1]:=x;
lm[tp,2]:=y; // moves=array [1..80,1..5] of integer;
lm[tp,3]:=x1; // napomena: integeri su 16-bitni
lm[tp,4]:=y1;
inc(tp);
end;
preradjeno u:
procedure add(var lm:moves;var tp:integer;x,y,x1,y1:integer);
begin
asm
mov ax,000Ah // ax:=10; (5x2 byte)
les di,tp // [di]:=tp;
mul es:word ptr [di] // pomnozimo ax sa tp
inc es:word ptr [di] // inc(tp), kad smo vec tu
les di,lm // smestimo lm u di
add di,ax // i dodamo ax da dobijemo addresu -> lm[tp+1,1]
end; // sada ide 32-bitni kod, kojeg TP ne ume da
// generise
inline ( // znam da je malo "prljavo"
$66/$8B/$46/$08/ // mov eax, [bp+08] -> x=[bp+0Ah],
y=[bp+08h]
$66/$26/$89/$45/$F6/ // mov es:[di-0Ah],eax -> lm[tp,1]:=y,
// lm[tp,2]:=x
$66/$8B/$46/$04/ // mov eax, [bp+04] -> x1=[bp+06h],y1=[bp+04h]
$66/$26/$89/$45/$FA // mov es:[di-06h],eax -> lm[tp,3]:=y1,
// lm[tp,4]:=x1
);
end;
Postignuto ubrzanje je ogromno ali mi se cini da ima mesta za
jos... Kod mene ova procedura uzme oko 2 sekunde od tog 1 min,
kada racunar "gleda" 6 polu-poteza unapred. Nije puno ali nije ni
malo kada bude trebalo gledati 10 polu-poteza.
Ova druga je mnogo vaznija i kriticnija. Evo je:
2)
function eval(var a:tabla):integer;
var sum:integer; //funkcija sabira polja a[i,j] i vraca zbir
begin //tabla=array [1..12,1..12] of integer
sum:=0;
for i:=3 to 10 do
for j:=3 to 10 do inc(sum,a[i,j]); // sum:=sum+a[i,j];
eval:=sum;
end;
zamenjeno sa:
function eval(var a:tabla):integer;assembler;
label l1,l2;
asm
xor ax,ax // ax ce igrati ulogu sum-a
les di,a // adresa pocetka matrice (a[1,1]) smestena u di
add di,66 // na to dodamo 66 (33*2 byte, krece se od a[3,10])
mov dx,8 // 10-3+1 vrsta
l2:
mov cx,8 // sabiramo 8 clanova jedne kolone
l1:
add ax,word ptr es:[di] // ax:=ax+a[i,j]
sub di,2 // j:=j-2;
loop l1
add di,40 // (12+8)*2 byte razlike
dec dx // sledeca vrsta
and dx,dx
jnz l2 // ako je dx=0 onda kraj
end; // u ax-u ostaje rezultat!
Ova funkcija uzima oko 12 sekundi od 1 min. To je vec ozbiljno i
zahteva dodatne optimizcije. Pitate se gde je ostatak od oko 45
sekundi. Pa vecina ostalog vremena ode na funkciju kojom se
proverava da li data pozicija predstavlja sah. Neverovatan
problem!
Eto, to je to.
Kada malo sam pogledam ovo sto napisah vidim da se niko ziv ne bi
zezao sa ovim. Ali ako ovo cita neki "manijak" za optimizaciju
(kao sto sam ja), i kojem je moto "usteda na jednoj instrukciji
moze biti veoma dragocena pri 10^7 iteracija", i ako taj neko ima
dovoljno vremena da prouci ovih 40-tak redova koda i uoci nesto
korisno, ja cu biti veoma zahvalan. Inace, mozda je glupo da
pitam, da li je mozda jos neko pravio svoj sahovski program?
(hehe, ko da nemaju ljudi sta pametnije da rade). Bas bi zeleo da
ih pustimo jedan na drugog. Mene je "vestacka" inteligencija
oduvek privlacila, zato sam i napisao ovo cudo. Ahh, zove se
Gandalf inace.
Izvinjavam se zbog duzine ovo poruke onima kojima je to zasmetalo.
asembler.305magn,
Kako promeniti boju ispisa na ekranu u jednom delu reda? Znam kako se boje
menjaju na celom ekranu ali mi to ne zadovoljava potrebe.
asembler.306stameni,
>> Kako promeniti boju ispisa na ekranu u jednom delu reda? Znam
>> kako se boje menjaju na celom ekranu ali mi to ne zadovoljava
>> potrebe.
Ako sam te dobro shvatio, mogao bi da ručno menjaš atribute,
recimo ovako:
procedure SetAttrib(x, y, status: byte);
begin
mem[$b800:2*x+160*y+1] := status
end;
Dakle, od početka video memorije (segment $b800) gađaš atribut po
atribut. Atributi se nalaze na neparnom offsetu.
asembler.307sasab,
> interapta,da izvucem koji je sve hardver u masini,razne statuse ,pa
> i neke ID bajtove.Ako ti to moze pomoci,poslacu ti ili ovde ili na
Bio bih zahvalan.
asembler.308jexy,
Imam nekih gadnih problema sa TD-om. Naime desava mi se to
da kada idem step-by-step (F8) kroz program TD jednostavno
preskoci (!?!?!) neke instrukcije ili se 'zaglavi' na nekoj
od instrukcija i nece da ide dalje !!!!
Takodje mi se desavalo da posle recimo 'mov di,0ah' u DI
se nalazi neki levi broj koji veze nema sa ovim prethodnim
ili sadrzaj DI ostane nepromenjen.
Probao sam to da degbagujem sa WD-om koji ide uz Watcom v10.5
i on je sve to dobro uradio ali se kod njega desavaju druge
stvari :(. Na primer posle
mov eax,10
shl eax,16
u eax se nalazi 0 !!!!
Ako neko ima ideju sta bi to moglo biti neka javi.
BTW, program koji sam testirao radi u real modu.
asembler.309qpele,
Imam nekih gadnih problema sa TD-om. Naime desava mi se to
da kada idem step-by-step (F8) kroz program TD jednostavno
preskoci (!?!?!) neke instrukcije ili se 'zaglavi' na nekoj
Je si li probao sa F7 ?
asembler.310jexy,
;; Je si li probao sa F7 ?
Da i nema nikakve razlike.. i dalje se zaglupi..
asembler.311firus,
Je> Ako neko ima ideju sta bi to moglo biti neka javi.
Jedno glupo pitanje. Da li je to tvoj program?
Ako nije tvoj, jako je moguće da se radi o antidebug zaštiti.
X
asembler.312jexy,
;;
;; Jedno glupo pitanje. Da li je to tvoj program?
;;
;; Ako nije tvoj, jako je moguce da se radi o antidebug zastiti.
;;
:) Pa naravno da je moj program..
asembler.313biber,
>> l2:
>> mov cx,8 // sabiramo 8 clanova jedne kolone
>> l1:
>> add ax,word ptr es:[di] // ax:=ax+a[i,j]
>> sub di,2 // j:=j-2;
>> loop l1
>> add di,40 // (12+8)*2 byte razlike
>> dec dx // sledeca vrsta
>> and dx,dx
>> jnz l2 // ako je dx=0 onda kraj
>> end; // u ax-u ostaje rezultat!
Malo brže je (bar na nekim procesorima)
umesto: sub di,2
napisati: dec di
dec di
Takođe, posle "dec dx" nije potrebno "and dx,dx" jer se pri "dec dx"
automatski postavlja ZF.
Dalje, ako je brzina imperativ, nemoj da sabiranje stavljaš u petlju,
nego "ručno" ispiši sva sabiranja. Čini mi se da ih imaš svega pedesetak.
add ax,(adresa elementa a[3,3])
add ax,(adresa elementa a[3,4])
add ax,(adresa elementa a[3,5])
itd.
asembler.314tomcat,
> Malo brze je (bar na nekim procesorima)
> umesto: sub di,2
>
> napisati: dec di
> dec di
Tako sam i ja prvobitno napisao i onda se iznenadio kada je sub
di,2 bio nekih 15 % brzi (na Cyrix-u).
> Takode, posle "dec dx" nije potrebno "and dx,dx" jer se pri "dec dx"
> automatski postavlja ZF.
Hvala. To sam prevideo.
> Dalje, ako je brzina imperativ, nemoj da sabiranje stavljas u petlju,
> nego "rucno" ispisi sva sabiranja. Cini mi se da ih imas svega pedesetak.
>
> add ax,(adresa elementa a[3,3])
> add ax,(adresa elementa a[3,4])
> add ax,(adresa elementa a[3,5])
Ima ih 64. I u pravu si ustedece 64x10 clockova. Jedino treba
ispisati sve i tada je vrlo osetljivo na promene.
> itd.
Sta jos? :)
asembler.315jexy,
;; procedure add(var lm:moves;var tp:integer;x,y,x1,y1:integer);
;; begin
;; lm[tp,1]:=x;
;; lm[tp,2]:=y; // moves=array [1..80,1..5] of integer;
;; lm[tp,3]:=x1; // napomena: integeri su 16-bitni
;; lm[tp,4]:=y1;
;; inc(tp);
;; end;
Prvo, nemoj da mnozis tp sa 10 vec to zameni sa siftovanjima pa ces
samo zbog toga dobiti veliko ubrzanje ako se rutina poziva mnogo puta tako
da bih ja ovo u asm-u uradio ovako..
procedure add(var lm:moves;var tp:integer;x,y,x1,y1:integer);assembler;
asm
les di,tp
mov ax,es:[di]
dec ax { prvi clan je lm[1,1] a ne lm[0,0] }
mov dx,ax
inc word ptr es:[di]
shl ax,3 {; tp*8}
add dx,dx {; tp*2}
add ax,dx {; tp*10}
les di,lm
add di,ax {; es:di -> lm[tp,1]}
db 66h;mov ax,[bp+8] {; mov eax,[bp+8] ax=y}
db 66h;ror ax,16 {; ror eax,16}
db 66h;stosw; {; lm[tp,1]:=x; lm[tp,2]:=y }
db 66h;mov ax,[bp+4] {; mov eax,[bp+4] ax=y1}
db 66h;ror ax,16 {; ror eax,16 }
db 66h;stosw; {; lm[tp,3]:=x1; lm[tp,4]:=y1 }
end;
asembler.316tomcat,
Nesto sto me je zapanjilo. Sledece naizgled najprostija petlja na
planeti kompajlirana Turbo Pascalom 7 je skoro 10 puta sporija nego
kad se napise u asembleru.
-----------
sum:=0;
for i:=1 to 8 do
for j:=1 to 8 do sum:=sum+a[i,j];
-----------
Vreme za 5,000,000 iteracija:
TP7=43.6 sec
ASM=4.6 sec
asembler.317jexy,
;;
;; Ima ih 64. I u pravu si ustedece 64x10 clockova. Jedino treba
;; ispisati sve i tada je vrlo osetljivo na promene.
;;
To se moze uprostiti ako doticnu rutinu pises odvojeno i zatim je ulinkujes
u PASCAL zato jer onda mozes koristiti makroe koji mnogo skracuju pisanje.
Takodje ako znas da konacna vrednost SIGURNO staje u 16 bita odnosno da se
pri sabiranju nece javiti prekoracenje onda mozes da koristis 32-bitne
registre i razlika u brzini bi bila velika.. Evo kako bi trebalo da izgleda
eksterni .asm fajl (npr. eval.asm) koga, nakon sto napravis eval.obj,
ulinkujes u PASCAL sa jednim
{$l eval.obj}
function eval(var a:tabla):integer;external;
..i onda normalno radis sa funkcijom.
BTW, ovde sam pretpostavio zbir svih vrednosti staje u 16 bita i da nema
negativnih vrednosti. Ako to nije ispunjeno onda ti preostaje da koristis
add ax,[...] umesto add eax,[...]
----------------------------------------------------
.386 code segment use16
assume cs:code
public eval
eval proc near
a equ [bp+4] ; +2 zbog push bp
push bp
mov bp,sp
push ds
lds si,a ; ds:si -> a[1,1]
add si,(2+2*12)*2 ; krecemo od a[3,3]
xor eax,eax
I=0
REPT 8
J=0
REPT 4 ; REPT 8 ako rez. ne staje u 16 bita
add eax,[si+(I*12+J)*2] ; *2 zato sto su word tipa
J=J+2 ; J=J+1 ako rez. ne staje u 16 bita
ENDM
I=I+1
ENDM
shld edx,eax,16 ; ovo ne treba ako
add ax,dx ; rez. ne staje..
pop ds
pop bp
ret 4
eval endp
code ends
end
asembler.318jjerry,
Evo jedno,verovatno laičko, pitanje :
Ovaaj..dakle,kako da proceduru u jednom ASM fajlu ulinkujem sa C++
programom.Tacnije ,trebaju mi procedure i neke definicije iz tog
fajla da bi ih povez'o sa hederom i ¨normalno¨ koristio.U asm fajlu
imam sve Public deklaracije,neke procedure imaju i argumente..itd.
Pomagajte !
asembler.319biber,
>>> add ax,(adresa elementa a[3,3])
>>> add ax,(adresa elementa a[3,4])
>>> add ax,(adresa elementa a[3,5])
>>> itd.
>>
>> Sta jos? :)
"Itd." se odnosilo na oner silne add instrukcije. Nisam se dosetio
ničeg više.
asembler.320jjerry,
Hi,zanima me ovako nesto...
Posto od skora pisem u asembleru (mozda bi se cak moglo reci da jos
ucim) sreo sam se sa SHL,SHR,ROL,ROR itd. dakle,shift i rotate
komande...Posto mi nisu jasne kako rade i cemu sluze (iako
naslucujem iz naziva),moze li neko da mi opise te komande,sta
rade,koje flegove setuju,i par primera.
Hvala unapred :)
asembler.321firus,
Jj> naslucujem iz naziva),moze li neko da mi opise te komande,sta
Jj> rade,koje flegove setuju,i par primera.
Znaš šta su meni rekli kad sam to pitao?
"Skini HELPPC."
Sad ja tebi to kažem. :)
Ako ne shvatiš ni posle toga, pitaj ponovo, onda ću da ti
objasnim.
X
asembler.322jjerry,
Ma znaam za sve te HELPPC fore (iako nemam taj HELPPC) imam onaj
Norton Guide bazu za asembler (stvar je super ,inace :
opsirno,detaljno) al' ja opet ne kapiram na kom principu i sta
ustvari rade one SHL(R) i ROL(R) komande :)
Opet kazem ,malo opsirnije,sa primerima :)
'Ajd' pozdrav !
asembler.323banga,
> opsirno,detaljno) al' ja opet ne kapiram na kom principu i sta
> ustvari rade one SHL(R) i ROL(R) komande :)
SHL pre posle
11010001 10100010 isto što i *2, u ovom slučaju ima OF
ROL " 10100011
Primer je za 8 bita
Za flagove i ostalo ćitaj bolan.
A kako ćeš to da primeniš zavisi od tebe
asembler.324firus,
Jj> opsirno,detaljno) al' ja opet ne kapiram na kom principu i sta
Jj> ustvari rade one SHL(R) i ROL(R) komande :)
Prvo pročitaj ovo.
Jel ovo bolje od tog što ti imaš. Ja bi rekao da jeste.
--- CUT HERE ---
SAL/SHL - Shift Arithmetic Left / Shift Logical Left
Usage: SAL dest,count
SHL dest,count
Modifies flags: CF OF PF SF ZF (AF undefined)
Shifts the destination left by "count" bits with zeroes shifted
in on right. The Carry Flag contains the last bit shifted out.
--- CUT HERE ---
Jj> Opet kazem ,malo opsirnije,sa primerima :)
Evo ga i primer. :))
Uzmeš neki broj, recimo 00110111 i nalazi se recimo u AX registru.
Daš mu SHL AX,3 i šta će se desiti?
Pa lepo ti kaže ono gore, ubaciće tri nule na početak i ovo pomeriti
udesno za tri mesta.
Znači posle ovoga u AX ostaje 00000110.
Da si stavio SHR AX,4 dobio bi 01110000.
Jel konačno jasno.
X
p.s. A da, uzmi Help PC. :)
asembler.325jjerry,
Za "ono gore" znam ,imam to.. :) Al' opet mi bas nije bilo
preterano jasno...:) OK hvala,al' sad me samo interesuje kakva bi
bila neka prakticna primena tih komandi :) Npr. da se dobije Hi i
Lo part nekog broja ?
OK je za SHL(R),a sta je sa ROL(R) i kakva je razlika izmedju SAL i
SHL ?
Izvin'te ako sam udavio i opet kazem 10X puno !!!
Pozdrav !
asembler.326r.i.s,
Zna li ko kako je moguce detektovati da li je ekran u modu
sa 43 odnosno 50 linija (EGA/VGA) mod ?
Klasicni BIOS poziv
mov ah,0fh
int 10h
ne pomaze.
asembler.327obren,
> Zna li ko kako je moguce detektovati da li je ekran u modu
> sa 43 odnosno 50 linija (EGA/VGA) mod ?
>
> Klasicni BIOS poziv mov ah,0fh int 10h ne pomaze.
To bi trebalo da radi, verovatno da negde grešiš. Ako nisi do sada,
obrati pažnju da se pri pozivu te BIOS funkcije prljaju SP, BP, AX,
SI i DI registri.
U svakom slučaju lakše je te informacije dobiti iz tzv. "BIOS data area"
gde na adresama 0000:0484h (byte) i 0000:044Ah (word) možeš saznati koji
je broj redova (-1) odnosno kolona u trenutnom video modu.
P.S. Ako nemaš nabavi Norton Guide za ASM, HelpPC ili TechRef (ima ih
na Sezamu).
asembler.328bokir,
NortonGuides za TASM 4.0 Ideal mode
ng_tasm4.zipasembler.329bokir,
NortonGuides sa Intel instrukcijama od XT-a do Pentiuma.
Uključuje CPU, FPU i MMX instrukcije, zajedno sa opcode-ovima.
ng_x86.zipasembler.330acap,
Trazim pomoc u vezi asemblerske grafike i pravljenja introa.
Interesuju me efekti i pointeri na prethodne zanimljive poruke.
Mbasta.
asembler.331jexy,
;; Trazim pomoc u vezi asemblerske grafike i pravljenja introa.
;; Interesuju me efekti i pointeri na prethodne zanimljive poruke.
;;
;; Mbasta.
U ovoj confi poruka takvog tipa je vrlo malo da ne kazem da ih uopste
i nema. Ako imas pristup internetu onda ti preporucujem da pogledas
sledece sajtove:
http://www.cdrom.com/pub/demos - Ogromna Hornet arhiva, ima na tone sorsova
ftp://x2ftp.oulu.fi/pub/msdos/programming - Takodje jos jedan gigant
Moja preporuka ti je da prvo poskidas tutorijale nekih jednostavnijih efekata
tipa plasma, fire, etc. pa ces kasnije moci i sam da kontas neke
komplikovanije
sorsove..
asembler.332mango,
Posto treba da radimo seminarski rad iz asemblera za skolu, a ja sam u stisci
sa vrmenom, da li bi neka dobra dusa htela da mi baci na mail neki
jednostavniji program (sors)sa eventualnim komentarima na problematicnim
mestima? Npr. neki programcic koji radi nesto sa diskovima isl. Stvar je
prilicno hitna. Thanx.
asembler.333vector,
Treba mi program 'exe2bin'. Ako ga neko ima, molio bih da mi posalje na
mail.
asembler.334jjerry,
Hi,treba mi nesto vezano za asemblerove DB,DW,DD,DT..komande.
Kada definisem neki string npr. String DB 'aaa$' cemu sluze neki
brojevi ispred i iza stringa npr. String DB 0,'aaa$',0AH,0EJ itd.
Konkretno,da li se time moze formatirati ispis,tako da se menja
boja ispisa ili da se sledeci string pojavi u drugom redu itd. ?
Pozdrav !
Jjerry
asembler.335jjerry,
Sorry,u prosloj poruci sam rek'o 0Ah,0EJ..:)) Umesto 0EJ treba da
stoji 0EH ,to je valjda shvaceno..:)
asembler.336jjerry,
Evo jednog programceta koji vraca informacije vezane za misa.
Skinite (pogotovu vlasnici Geniusa i ostalih ne MSmouse miseva)
i napisite ovde ili na mail (bolje na mail) da li je vratio tacne
informacije,da li je bilo problema itd.
Hvala !
Jjerry
minfo.exeasembler.337space.ace,
> Hi,treba mi nesto vezano za asemblerove DB,DW,DD,DT..komande.
> Kada definisem neki string npr. String DB 'aaa$' cemu sluze neki
> brojevi ispred i iza stringa npr. String DB 0,'aaa$',0AH,0EJ itd.
Kada definišeš string, obično se deklariše sa DB (Declare Byte), i
moraš ga terminisati znakom$. Brojevi posle toga su ti kodovi za
Line Feed i Enter, mada možeš pogledati u HelpPc-u specijalne kodove.
Njima, kao što si i sam rekao, formatiraš ispis. Možeš ih staviti
ispred, iza, u sredinu, gde želiš :)
asembler.338raven,
Da li neko zna da li je moguce da kada se nakacim na neki hardverski
interapt, na primer tastaturu (09h) da li je moguce pod dosom
otvoriti odnosno uopste raditi sa fajlovima. preko dosovog
interepta..I ako nije kako to da uradim preko BIOS-a..posto
nemam potpunu dokumentaciju, a davno je bilo kada sam se zezao sa
time..:)
Raven.
asembler.339banga,
> Da li neko zna da li je moguce da kada se nakacim na neki
> hardverski interapt, na primer tastaturu (09h) da li je moguce
> pod dosom otvoriti odnosno uopste raditi sa fajlovima. preko
> dosovog
Odgovor je da, ali nije jednostavno.
Skini za početak napr. dos\prog\asm\tbones07.zip pa prouči probleme. Ne
sećam se da li u "kosturu" ima i rad sa fajlovima, ali za početak prvo
savladaj ovo.
A kod rada sa fajlovima imaš dodatni tajming problem jer ne možeš da
čučiš u svom interptu koliko ti hoćeš
asembler.340destructor,
Nije striktno asembler, ali tu je negde ...
Znaci: Potreban mi je algoritam za generisanje slucajnih
brojeva, koji se moze relativno kratko kodirati u asembleru
(brzina je dobrodosla), a da ima neki pristojan period.
Eto .. toliko
asembler.341obren,
> Znaci: Potreban mi je algoritam za generisanje slucajnih
> brojeva, koji se moze relativno kratko kodirati u asembleru
> (brzina je dobrodosla), a da ima neki pristojan period.
Evo ti sors rand() funkcije iz Borland C-a, lako ćeš ga prepevati
na ASM. Nije neki kvalitet (školski primer random generatora) ali
je jako brzo i jednostavno za kodiranje...
------------------ cut here ------------------
#define MULTIPLIER 0x015a4e35L
#define INCREMENT 1
static long Seed = 1;
void srand(unsigned seed)
{
Seed = seed;
}
int rand(void)
{
Seed = MULTIPLIER*Seed + INCREMENT;
return((int)(Seed >> 16) & 0x7fff);
}
------------------ cut here ------------------
Ako ti treba surovi kvalitet ;) a ne brzina, onda pogledaj sors vezan
uz poruku, tvrde da je najbolji poznati RND generator (čak ako i nije
najbolji, jako je kvalitetan).
best_rnd.casembler.342jjerry,
Hi,
Kako da pomocu funkcije 02h interapta 21h odstampam dvocifren broj..
(Podsecam da je to funkcija koja trazi ASCII scan code karaktera u
DL-u).Pomislio sam da rastavljam cifre sa npr. broj je ab
a = int(ab / 10) ; b = ab - 10 * b
pa onda da ih printujem svaku pojedinacno,ako ima neko resenje
molio bih da posalje i kratak sors..Makar samo principe.
Hvala !
asembler.343obren,
> Kako da pomocu funkcije 02h interapta 21h odstampam dvocifren broj..
> (Podsecam da je to funkcija koja trazi ASCII scan code karaktera u
> DL-u). Pomislio sam da rastavljam cifre sa npr. broj je ab
> a = int(ab / 10) ; b = ab - 10 * b
> pa onda da ih printujem svaku pojedinacno, ako ima neko resenje
> molio bih da posalje i kratak sors.
Za tako nešto se može iskoristiti instrukcija AAM koja radi upravo
ono što ti treba:
AH = AL div 10
AL = AL mod 10
Znači, stavi broj u AL i izvrši instrukciju AAM, nakon toga imaš u AH
cifre desetica a u AL cifre jedinica. Cela sekvenca bi bila otprilike:
mov al, 21
aam ; sada je ah=broj/10, al=broj%10
mov dl, ah ; treba prvo odštampati cifre desetica
mov dh, al ; pa cifre jedinica
add dx, 3030h ; dodaj i višem i nižem bajtu po ASCII kod nule ('0')
mov ah, 02h ; DOS funkcija 02h, character output
int 21h
xchg dl, dh ; sad nam trebaju jedinice koje su u ah
int 21h ; ah=2 iz prethodnog poziva
asembler.344jjerry,
Hvala ti,otprilike sam na to mislio,ali sam nesto pokusavao sa IDIV
pa IMUL..Za ovo AAM nisam znao..
Jos jednom 10X !!!
asembler.345vector,
U pitanju je A86 shareware assembler. Ukoliko postoji greska u izvornom
kodu, program (A86) pri kompajliranju nece ispisati na ekran o cemu se
radi, vec ce sve podatke o greskama uneti u sam izvorni fajl, sto je vrlo
iritirajuce ukoliko je program iole veci.
Ja bih hteo da mi program podatke o greskama ispisuje na ekran, a ne u
izvorni fajl. Da li je to uopste moguce? (mozda preko nekog svica?)
asembler.346jjerry,
E ljudi,evo vam jedan programcic koji testira Trident SVGA cip.
Pa,ko ima Tridentove kartice..neka proveri,please...
Bacite na mail sta vam je rek'o :)
Poz.
trident.exeasembler.347obren,
> U pitanju je A86 shareware assembler. Ukoliko postoji greska u izvornom
> kodu, program (A86) pri kompajliranju nece ispisati na ekran o cemu se
> radi, vec ce sve podatke o greskama uneti u sam izvorni fajl, sto je vrlo
> iritirajuce ukoliko je program iole veci.
Zaista bi bilo lepo da poruke o grešci ispisuje _i_ na ekran, ali mislim
da je ono što on radi jako korisno, pošto ćeš u slučaju greške svakako
ponovo ulaziti u editor. U tom slučaju samo ispraviš grešku a njegovo
upozorenje na tom mestu možeš slobodno da ostaviš - automatski će ga
izbaciti ako se greška više ne javlja pri novom prevođenju.
> Ja bih hteo da mi program podatke o greskama ispisuje na ekran, a ne u
> izvorni fajl. Da li je to uopste moguce? (mozda preko nekog svica?)
Mislim da nema načina... :(
asembler.348vector,
Ů▄▀Ţ Zaista bi bilo lepo da poruke o gresci ispisuje _i_ na ekran, ali
Ů▄▀Ţ mislim da je ono sto on radi jako korisno, posto ces u slucaju greske
Ů▄▀Ţ svakako ponovo ulaziti u editor. U tom slucaju samo ispravis gresku a
Ů▄▀Ţ njegovo
Jeste korisno, ali sta raditi u slucaju da sors programa zauzima 100K ili
vise? Traziti preko editora znak '~' cime A86 obelezava gresku u sorsu? :)
asembler.349space.ace,
> Ja bih hteo da mi program podatke o greskama ispisuje na ekran, a ne u
> izvorni fajl. Da li je to uopste moguce? (mozda preko nekog svica?)
Ne verujem da je slično moguće, ali je u izvornom kodu lakše naći grešku
ako u u njemu stoji podatak (pointer) na grešku. Ako ispraviš grešku i
ponovo propustiš kroz a86, te greške će nestati iz izvornog koda a kod
će se lepo kompajlirati. So, možda je ovako i lakše.
asembler.350obren,
> Jeste korisno, ali sta raditi u slucaju da sors programa zauzima 100K ili
> vise? Traziti preko editora znak '~' cime A86 obelezava gresku u sorsu? :)
A kako bi i inače tražio grešku da ti kod tolikog programa napiše
nešto poput:
Error trt-mrt, line 89
Error štuc-muc, line 1230
Error ovo-ono, line 6843
. . .
Jel onda beležiš na papir brojeve linija gde su bile greške pa onda
ideš kroz editor pa trebiš? ;) Po meni je jako dobro što u sorsu naznači
greške jer ionako ti je cilj valjda da te greške ispraviš. U tom slučaju
imaš sva mesta obeležena i čas posla se ispopravlja šta ne valja. Kod
TASM-a nikad ne mogu da zapamtim više od 2-3 prijavljene greške u jednom
cugu, već moram prvo njih da ispravim pa ponovo TASM, pa ponovo par
ispravljenih grešaka...
Naravno ima i specijalizovanih editora (Qedit i sl.) koji mogu da se
konfigurišu tako da na osnovu outputa TASM-a omoguće skakanje na
greške, ali na kraju ipak ispada lakše da ti je sve označeno u sorsu
nego da skakućeš između Error prozora u editoru i samog ASM sorsa.
Naravno, kao što sam već i rekao, zgodno bi bilo da se vide greške _i_
na konzoli pored označavanja u sorsu, ali generalno mi se sviđa ta ideja
sa markiranjem, pošto A86 ionako automatski poizbacuje ta upozorenja ako
više nema grešaka na označenim mestima.
asembler.351firus,
> U pitanju je A86 shareware assembler. Ukoliko postoji greska u
> ...
> ...
> Ja bih hteo da mi program podatke o greskama ispisuje na ekran,
> a ne u izvorni fajl. Da li je to uopste moguce? (mozda preko
> nekog svica?)
A da ti to lepo zapakuješ i pošalješ pa da ga
"upgrade-ujemo" ?!
asembler.352zdravkod,
Kako da kazem CD-u PLAY ???
Koji interrupt gde sta kako ??? jel zna neko ..
asembler.353van.gog,
Ako bi neko bio ljubazan da mi napshe proceduru za startovanje
nekog programa (EXEC proceduru) odnosno kako se koristi fia.
4B (int21) i da li ja treba ta pravim PSP ili je to ukljuceno
u samu 4B fiu. ... i jos ... kako odrediti vrednosti za
ss,cs i ostale registre koji se prosledju u parametar bloku
za isto-pomenutu fiu.
(NEMOJTE DA SALJETE ISECKE IZ HELPPC-a i sl.)
Molim za malo koda ;> VAN.GOG!
asembler.354bokir,
> Ako bi neko bio ljubazan da mi napshe proceduru za startovanje
> nekog programa (EXEC proceduru) odnosno kako se koristi fia.
Evo malo koda :)
exec.asmasembler.355vector,
A86 macro assembler, V4.02 updated
with INCLUDE files, listings, no limit
on size of source files, fwd refs in
complex expressions, END operand,
default ORG END in DATA SEGMENT, and
more! Contains info about A386/D386.
From Eric Isaacson Software.
a86v402.zipasembler.356vector,
D86 debugger, V4.02, updated
with keystroke scripts, macro
keys, Undo command, and
file copy and delete.
Contains info about A386/D386.
From Eric Isaacson Software.
d86v402.zipasembler.357vector,
Predlazem da se stare verzije A86 shareware asemblera obrisu iz
direktorijuma i da se umesto njih stavi nova (v4.02). :)
asembler.358soul,
Enter: East Gate. Intro no. 000.
Hope to see you soon.
egate0.zipasembler.359van.gog,
Aloha ...
Evo ovako ... malo sam modifikovao onaj exec prog od pre par
poruka u cilju jelte' experimentisanja ... dakle poziva se
sa ah,4b (exec) ali sa AL,1 (create PSP, load but not EXEC)
a kasnije kad izvucem CS i IP iz param bloka zajedno sa SS i SP
i stavim na stack (CS i IP), uradim jedno RETF (JUMP FAR)
on pozove prog koji treba da se startuje al kaze nema MEM?!?
E sad ... kako to da resim ???
(promnenite samo ime programa koji se pokrece)
e.asmasembler.360van.gog,
Aloha.
Evo nadjoh o CD-u napokon. Ali (eh) problem. Prog je u asm-u
al vezan CPP-om pa evo prosledjujem source.
Ako neko pokrene CD-ovim (ili necim drugim) neka mi se obavezno
javi ... thanx
cd.rarasembler.361jjerry,
E,'ajde nek mi neko napise funkciju za dobijanje copyright stringa
za MS MOUSE u C++-u..Samo cu vam reci da je INT 33h,f-ja AX=004Dh i
da vraca copyright string u ES:DI..Meni vraca djubre,e sad ili ja
nemam dobar drajver,ili je kod los :)
Poz.
asembler.362jjerry,
Cemu konkretno sluze [] zagrade oko imena nekih promenljivih ili
registara kao npr. [ES:DX],[blabla] itd. ?
asembler.363vector,
<--- E,'ajde nek mi neko napise funkciju za dobijanje copyright stringa
<--- za MS MOUSE u C++-u..Samo cu vam reci da je INT 33h,f-ja AX=004Dh i
<--- da vraca copyright string u ES:DI..Meni vraca djubre,e sad ili ja
<--- nemam dobar drajver,ili je kod los :)
Kod mene je sadrzaj ES:DI memorijske lokacije pre i posle poziva te
funkcije potpuno isti. BTW, odakle ti informacija o toj funkciji?
Ni IntrList (v1.2) ni HelpPC (v2.1) nemaju podataka o tome...
asembler.364stameni,
>> <--- za MS MOUSE u C++-u..Samo cu vam reci da je INT 33h,f-ja AX=004Dh
>> i <--- da vraca copyright string u ES:DI..
>> Kod mene je sadrzaj ES:DI memorijske lokacije pre i posle poziva te
>> funkcije potpuno isti. BTW, odakle ti informacija o toj funkciji?
>> Ni IntrList (v1.2) ni HelpPC (v2.1) nemaju podataka o tome...
Samo da dojavim da je su i kod mene pre i posle poziva funkcije
je te lokacije neizmenjene. Štaviše, mislim da se od registara
jedino menja IP ;) Drajver za miša je Geniusov, verzija 8.08.
Imaš dosta staru IntList, što ponekad može biti prednost, jer
je lakše pronaći "pravu stvar" u manjim fajlovima, a kad nađeš,
siguran si da će da radi i na DOS-u < 3.00 :) U verziji 4.2 je
uredno (reklo bi se) dokumentovana funkcija, nemam pojma što ne
radi.
asembler.365vector,
<--- Samo da dojavim da je su i kod mene pre i posle poziva funkcije
<--- je te lokacije neizmenjene. Stavise, mislim da se od registara
<--- jedino menja IP ;) Drajver za misa je Geniusov, verzija 8.08.
Menja se i DI registar, medjutim na ES:DI se nista ne nalazi. :)
Takodje imam Geniusov mouse drajver.
<--- Imas dosta staru IntList, sto ponekad moze biti prednost, jer
Gde naci noviji IntrList? :)
asembler.366jjerry,
Hmmm...podatak je iz Ralph-Brownove interrupt liste..evo,lepo pise
poziva se sa 004Dh u AX-u i vraca pointer na kopirajt string u
ES:DI..Da ti nisi gled'o ES:DX ?
asembler.367vector,
<--- Hmmm...podatak je iz Ralph-Brownove interrupt liste..evo,lepo pise
<--- poziva se sa 004Dh u AX-u i vraca pointer na kopirajt string u
<--- ES:DI..Da ti nisi gled'o ES:DX ?
Ne, gledao sam ES:DI, bas kako sam i rekao :)
BTW, kako gledas te podatke iz njegove interapt liste? Preko tekst
editora? Ili imas nesto poput WindowBook programa?
asembler.368stameni,
>> Menja se i DI registar, medjutim na ES:DI se nista ne nalazi. :)
Šta da kažem, meni ne menja ni DI, a tamo gde pokazuje ES:DI
stvarno nema ničeg.
>> Gde naci noviji IntrList? :)
Ima na Sezamu u dos\prog\info verzije 4.8 i 5.1 (možda i neke
novije). However, preporučuju ne bacati ni 1.2, ako već imaš; nije
veliko (verovatno), pa dobro dođe ponekad "za prvu pomoć" :)
asembler.369jjerry,
JJ=> Ne, gledao sam ES:DI, bas kako sam i rekao :)
OK :)
JJ=> BTW, kako gledas te podatke iz njegove interapt liste? Preko tekst
JJ=> editora? Ili imas nesto poput WindowBook programa?
Ne..imas to u DOS\PROG\INFO..ja gledam preko Norton
Commandera,svaki ASCII editor ce posluziti :)
asembler.370stameni,
>> JJ=> BTW, kako gledas te podatke iz njegove interapt liste? Preko
>> tekst JJ=> editora? Ili imas nesto poput WindowBook programa?
>>
>> Ne..imas to u DOS\PROG\INFO..ja gledam preko Norton
>> Commandera,svaki ASCII editor ce posluziti :)
Trebalo bi da je u arhivama programče koje se zove Intervue,
kojim se efikasno mogu pratiti podaci.
Ima i programčića (sa sorsovima) koji konvertuju liste u
popularne help formate, al' o tome ne znam puno, jer ih ne
koristim.
asembler.371jjerry,
Hmmm..ovde ne pishe za koju verziju drajvera je funkcija,ali ajde
da probamo nesto drugo..ovde kaze da f-ja vraca ili string "***
This is Copyright 1983 Microsoft" ili "Copyright 19XX...".Dalje
kaze da u Genius verziji 9.06 potpis "KYE" dolazi odmah posle one
poruke..Dakle,da saberemo kol'ko su poruke dugacke,uvecamo DI za
tol'ko,i ako pise "KYE" onda raaaadiiiiiiii...!! :))
Poz.
asembler.372vector,
<--- >> Gde naci noviji IntrList? :)
<---
<--- Ima na Sezamu u dos\prog\info verzije 4.8 i 5.1 (mozda i neke
<--- novije). However, preporucuju ne bacati ni 1.2, ako vec imas; nije
<--- veliko (verovatno), pa dobro dode ponekad "za prvu pomoc" :)
Pod ovim 'noviji IntrList' sam mislio na program kompanije WindowBook,
a to je neki hipertekst reader Ralf Brownove liste interapta. :)
asembler.373vector,
<--- Trebalo bi da je u arhivama programce koje se zove Intervue,
<--- kojim se efikasno mogu pratiti podaci.
<--- Ima i programcica (sa sorsovima) koji konvertuju liste u
<--- popularne help formate, al' o tome ne znam puno, jer ih ne
<--- koristim.
Ok, presnimio sam INTER51x.ZIP fajlove i otpakovao ih. Zatim sam
startovao IL2HDK program i konvertovao listu u nekakav .hdf fajl.
Sta dalje? U inter51*.zip arhivama nema programa koji cita takve
.hdf fajlove, dok u uputstvu pise da se oni moraju kompajlirati
pomocu nekog programa (ne secam se tacnog imena). Ima li resenja?
(u INTER48E.ZIP arhivi se nalazi nekoliko programa koji konvertuju
listu u neke help formate, medjutim, to meni nista ne koristi jer
nemam nijedan program koji cita to)
Moze li se negde naci .NG baza ove interrupt liste?
asembler.374biber,
> A86 macro assembler, V4.02 updated
> with INCLUDE files, listings, no limit
> on size of source files, fwd refs in
Da li neko ima A386 (verziju ovog asemblera za 386+ procesore)?
asembler.375biber,
> U pitanju je A86 shareware assembler. Ukoliko postoji greska u izvornom
> kodu, program (A86) pri kompajliranju nece ispisati na ekran o cemu se
> radi, vec ce sve podatke o greskama uneti u sam izvorni fajl, sto je vrlo
> iritirajuce ukoliko je program iole veci.
>
> Ja bih hteo da mi program podatke o greskama ispisuje na ekran, a ne u
> izvorni fajl. Da li je to uopste moguce? (mozda preko nekog svica?)
Postoji svic za tako nesto, koga naravno ne znam napamet, a i
nisam ga nesto ni koristio. Ipak je dobra ideja da se greske upisu
u sors.
U svakom slucaju procitaj uputstvo koje ide uz program u obliku
txt fajla i naci ces svic.
asembler.376stameni,
>> Pod ovim 'noviji IntrList' sam mislio na program kompanije WindowBook,
>> a to je neki hipertekst reader Ralf Brownove liste interapta. :)
Ja sam mislio na noviju *bazu*. No, kakav je taj WindowBook?
Ako valja i ako je public, šta misliš da ga okačiš file
moderatorima?
asembler.377stameni,
>> Ok, presnimio sam INTER51x.ZIP fajlove i otpakovao ih. Zatim sam
>> startovao IL2HDK program i konvertovao listu u nekakav .hdf fajl.
>> Sta dalje? U inter51*.zip arhivama nema programa koji cita takve
>> .hdf fajlove, dok u uputstvu pise da se oni moraju kompajlirati
>> pomocu nekog programa (ne secam se tacnog imena). Ima li resenja?
Priložen je progam INTERVUE i jedan batch (valjda beše IV.BAT)
koji ga instalira i kasnije poziva ako te mrzi da kucaš celo
INTERVUE. Ja koristim (isključivo) njega, jer donedavno nisam imao
te... transformere ;) a u međuvremenu sam navikao na dotičnog.
Nema source.
>> Moze li se negde naci .NG baza ove interrupt liste?
To bi bila prava stvar. Ako imaš NG compiler (il' kako se već
zove), imaš uz inter???.zip program kojim možeš da praviš takve
fajlove.
asembler.378vector,
<--- Da li neko ima A386 (verziju ovog asemblera za 386+ procesore)?
Koliko sam shvatio iz uputstva A86 (v4.02), test verzija A386 se moze
dobiti jedino registracijom ovog A86 asemblera.
asembler.379vector,
<--- Ja sam mislio na noviju *bazu*. No, kakav je taj WindowBook?
<--- Ako valja i ako je public, sta mislis da ga okacis file
<--- moderatorima?
IntrList (WB) nije ni shareware ni public domain. :) Cini ga 1 .exe fajl
velicine jednog megabajta. Podaci su dosta matori, medjutim, program je
zaista odlican. Uz poruku sam prikacio nekoliko slika iz programa. :)
d00.arjasembler.380zeljkoj,
> Moze li se negde naci .NG baza ove interrupt liste?
Ja sam celu interapt listu konvertovato u Windows .HLP format (pomoću
priloženog programa), još 1995. (verzija 4.8).
asembler.381jjerry,
100% vam je poznata 0Ah f-ja interapta 33h za definisanje
softverskog (i hardverskog) text kursora..Fora je sto u CX treba da
se stavi AND maska,a u DX XOR maska kursora..Svasta sam radio al'
nikako da dobijem "dobre" kursore :( Ima l' neko resenje..i ako
moze format tih maski.
Pozdrav !
asembler.382stameni,
>> <--- Ja sam mislio na noviju *bazu*. No, kakav je taj WindowBook?
>> IntrList (WB) nije ni shareware ni public domain. :)
Sad je jasnije, sve vreme sam mislio da koristiš staaaru
verziju Interrupt Lists Ralfa Browna. Šta da radiš kad se slično
zovu...
asembler.383vector,
<--- Sad je jasnije, sve vreme sam mislio da koristis staaaru
<--- verziju Interrupt Lists Ralfa Browna. Sta da radis kad se slicno
<--- zovu...
To i jeste stara verzija njegove liste, medjutim, upakovana je u jedan
program u kome sve gledas pomocu hiperteksta, a taj program kompanije
WindowBook Inc. se zove IntrList. :)
asembler.384jjerry,
Evo...bavio sam se malo izvlacenjem stringova iz memorije,pa evo
jednog programceta koje stampta MS-DOS version string..Ja imam
MS-DOS 6.22 (pod Win95 7.0) ali pre nego sto ga
startujete,proverite lokacije od 9000:CF90h do 9000:D004h
P.S Sasvim slucajno sam pronasao da tu stoji DOS string uz pomoc
nekog pretrazivaca memorije.. :))
dos_str.exeasembler.385jjerry,
E pa ljudi,konacno sam uspeo..
Funkcija 004Dh je sasvim tacna i pravilno dokumentovana !
Kao sto je i pisalo..posle poziva te f-je,u ES:DI se nalazi
copyright string za microsoft.A u Genius mouse 9.06 (moja verzija)
potpis "KYE" zaista odmah prati pomenuti string..
Evo vam EXE-fajla..ako treba sors (kao dokaz :> poslacu ;)
Poz.
mousestr.exeasembler.386jjerry,
Primeticete da su duzine EXE programa koji trazi MS-DOS string i
Mouse copyright string jednake :) Ne znam zasto,ali u oba slucaja
je duzina jednaka 537 bajtova..Cak je i sadrzaj fajla vrlo slican :)
asembler.388vector,
<--- Primeticete da su duzine EXE programa koji trazi MS-DOS string i
<--- Mouse copyright string jednake :) Ne znam zasto,ali u oba slucaja
<--- je duzina jednaka 537 bajtova..Cak je i sadrzaj fajla vrlo slican :)
Velicina prvog fajla je 573, a drugog 537 bajtova. Nisu bas jednaki ;)
asembler.389vector,
<--- E pa ljudi,konacno sam uspeo..
<--- Funkcija 004Dh je sasvim tacna i pravilno dokumentovana !
<--- Kao sto je i pisalo..posle poziva te f-je,u ES:DI se nalazi
<--- copyright string za microsoft.A u Genius mouse 9.06 (moja verzija)
<--- potpis "KYE" zaista odmah prati pomenuti string..
<--- Evo vam EXE-fajla..ako treba sors (kao dokaz :> poslacu ;)
Ovaj .exe radi lepo, zaista je pisalo '*** This is Copyright 1983
Microsoft ***'. Medjutim, ne razumem kako prvi put to nisam video.
Siguran sam da sam startovao debug, ukucao niz komandi:
a 100
mov al, 4d
int 33
... i posle trejsovanja te 2 instrukcije ukucao: d es:2025, i apsolutno
sam siguran da se nista nije pojavilo osim djubreta ;) Medjutim, sad
lepo radi? Hmm, ..., ajde ipak, ;) mozda sam stavio 'd ds:2025' ili
tako nesto... anyway, evo A86 sorsa koji radi posao...
mouse.arjasembler.390jjerry,
Evo vam onaj sors za MSMOUSE Copyright string.Ovaj put je TASM
verzija ;)
mousestr.asmasembler.391jjerry,
Evo imam par pitanja ovde...
Dakle..Kad se program startuje (prepusti se njemu kontrola) DS i ES
se menjaju i pokazuju na pocetak programovog PSP-a (DS:0000 i ES:0000).
Konkretno,kada trazim neki fajl,i da bi video sta sam nasao moram da
pregledam DTA ? I da li se taj DTA ;) uvek nalazi na ofsetu 80h od
pocetka PSP-a ?
P.S Ako bi mogao neko strucan za tu oblast :) da mi posalje jedan
primer,cisto radi ilustracije :)
asembler.392jjerry,
Ajmo..sta je to FCB i cemu sluzi ? Nego..kad pozovem f-ju 11h\21h
(Find 1st file - FCB) jel' treba da sacekam neko vreme ili je vec
tu rezultat u AL a DTA pun ? Koja je procedura za trazenje fajlova ?
Nema sanse da je samo "gola" funkcija :) Pozoves i - eto ti :)
asembler.393jjerry,
Evo vam jedno programche za koje sumnjam da radi,iako ne daje neke
bezveze rezultate..Dakle,ja na pocetku f-jom 1A\21 stavim DTA na
neku bezveze adresu,onda izvucem tu istu adresu i uporedim je sa
PSP:80h i on uporno tvrdi da je DTA bas tu (??!)
Ko zna gde gresim nek' javi :)
dta.asmasembler.394jjerry,
JJ=>... i posle trejsovanja te 2 instrukcije ukucao: d es:2025, i apsolutno
^^^^
Sto bas 2025 ? Naso si da je u DI bilo 2025 ??
asembler.395vector,
Ů▀Ţ Sto bas 2025 ? Naso si da je u DI bilo 2025 ??
Ta funkcija mi obicno vraca 2025h u DI. :)
asembler.396space.ace,
> Ajmo..sta je to FCB i cemu sluzi ? Nego..kad pozovem f-ju 11h\21h
To je File Control Block, zaostalo još od DOS-a 1 :). Bolje koristi
4EH (findfirst) i 4FH (findnext), samo u DS:DX strpaš pointer na
ime fajla i gotovo. Za detalje oko atributa (CX) pogledaj neki help.
> tu rezultat u AL a DTA pun ? Koja je procedura za trazenje fajlova ?
> Nema sanse da je samo "gola" funkcija :) Pozoves i - eto ti :)
To je u stvari skup funkcija, i to findfirst i findnext, a rade na
sledećem principu:
proveri prvi fajl da li odgovara kriterijumu (findfirst)
ako ne odgovara, proveri sledeći (findnext),
itd.
asembler.397sigmund,
Vidi poruku u cccc 9.434
asembler.398mdimitrijevic,
> Dakle..Kad se program startuje (prepusti se njemu kontrola) DS i ES
> se menjaju i pokazuju na pocetak programovog PSP-a (DS:0000 i ES:0000).
> Konkretno,kada trazim neki fajl,i da bi video sta sam nasao moram da
> pregledam DTA ? I da li se taj DTA ;) uvek nalazi na ofsetu 80h od
> pocetka PSP-a ?
DTA se skoro uvek nalazi na ofsetu 80h. Možeš postaviti svoju adresu za
DTA, isto tako možeš preuzeti trenutnu adresu DTA.
Preuzimanje adrese DTA:
MOV AH,2Fh
INT 21h
ES:BX - adresa DTA
Postavljanje adrese DTA:
MOV AH,1Ah
DS:DX - adresa nove DTA
INT 21h
Pozdrav,
Marjan
asembler.399bokir,
Evo jednog shareware asemblera:
CrossFire Assembler
xfire510.zipasembler.400vector,
> Ako neko pokrene CD-ovim (ili necim drugim) neka mi se obavezno
> javi ... thanx
Nisam pokrenuo, ali sam iskopao ovaj FAQ o programiranju CD-ROMova iz
ASM Snippets arhive. Sadrzaj fajla:
Section 0 - Availability
0.01. How can I get the latest copy of this FAQ?
Section 1 - MSCDEX Status
1.01. How do I know if MSCDEX is installed?
1.02. How do I determine the MSCDEX version?
Section 2 - CD-ROM Existence
2.01. How many CD-ROMs are present?
2.02. Which drives are CD-ROMs?
2.03. How do I get the name of the CD-ROM device driver?
Section 3 - Drive Interface
3.01. How do I open the door?
3.02. How do I close the door?
3.03. How do I unlock the door?
3.04. How do I lock the door?
3.05. How do I reset the drive?
3.06. How do I get drive status?
Section 4 - Drive Capacity
4.01. What sector size is supported?
4.02. How many sectors are on the disk?
4.03. How much data is on the disk?
Section 5 - Volume Table of Contents
5.01. How do I get the abstract file name?
5.02. How do I get the bibliography file name?
5.03. How do I get the copyright file name?
5.04. How do I read the Volume Table of Contents (VTOC)?
Section 6 - Audio
6.01. How do I find out how many tracks are on a CD?
6.02. What are Red Book and HSG formats?
6.03. How can I determine where a particular track starts?
6.04. How do I play audio?
6.05. How do I pause audio playback?
6.06. How do I resume audio playback?
cdromfaq.arjasembler.401vector,
Ajde ovako. Imam fajl XYZ.DAT i od njega treba da napravim fajl XYZ.DB
koji u sebi sadrzi nesto ovako:
db 04C,02F,001,010,0FF,0FF,013,064,0AB,008,099,0AC,0BC,0F3,0EF,085,021
db 027,0A3,08F,0C2,038,0D5,098,057,018,024,063,0EE,075,09A,048,053,0FF
Naravno, kao sto se i moze pretpostaviti, bajt 4C (hex) je prvi bajt
ulaznog fajla XYZ.DAT, 2F je drugi bajt, 01 je treci, itd, itd. Znaci, treba
mi nesto sto ce fajlove da mi prebacuje u DB format. Znam da zeljeni fajl mogu
da linkujem sa sorsom svog programa, medjutim, treba mi bas ovo. Rekoh da se
ne mucim - ovako nesto sigurno postoji, valjda je nekom zatrebalo? :)
asembler.403zeljkoj,
> Ajde ovako. Imam fajl XYZ.DAT i od njega treba da napravim fajl
> XYZ.DB koji u sebi sadrzi nesto ovako:
Evo, napisao sam programčić koji radi upravo to. Iz komandne linije uzima
ime fajla koji treba obraditi, a izlaz ispisuje na ekran (možeš ga usmeriti u
fajl pomoću > ). Prilično je spor, jer čita bajt po bajt, ali valjda će
poslužiti...
file2db.exeasembler.404vector,
> Evo, napisao sam programcic koji radi upravo to. Iz komandne linije uzima
> ime fajla koji treba obraditi, a izlaz ispisuje na ekran (mozes ga
> usmeriti u fajl pomocu > ). Prilicno je spor, jer cita bajt po bajt, ali
> valjda ce posluziti...
Program je OK, samo mi treba jos nesto: obavezan je karakter '0' pre
svakog bajta, dok 'h' (posle bajta) nije potreban, zbog toga sto A86 kompajler
hex brojeve obelezava nulom ispred broja. Pored toga, trebalo bi samo smanjiti
broj tih bajtova u jednom redu sa 20 na 15. :)
asembler.405firus,
> Ajde ovako. Imam fajl XYZ.DAT i od njega treba da napravim fajl
> XYZ.DB koji u sebi sadrzi nesto ovako:
Seo sam i napisao jedan takav utility. Šaljem ga prikačen uz
poruku. Poziva se iz komandne linije sa:
DB ime_ulazne_datoteke širina [ime_labele]
gde je širina broj elemenata koji slede iza DB, a opcioni parametar
labela je ime labele koja se daje tome DB bloku. Kao rezultat rada
dobijaš .INC datoteku (valjda je neka konvencija da se include
datoteke za asembler (prez)imenuju sa .INC B).
BTW, tekst koji se ispisuje je na engleskom, jer sam nekako
navikao da utility-je tako radim (ko zna, možda dospe i u
inostranstvo, pa da se ne pate sa srpskim ;)
P.S. Eh, da, program je freeware na nivou sorsa.
db.zipasembler.406vector,
> Seo sam i napisao jedan takav utility. Saljem ga prikacen uz
> poruku. Poziva se iz komandne linije sa:
Thx, program je OK. :)
asembler.407mdimitrijevic,
> Program je OK, samo mi treba jos nesto: obavezan je karakter '0' pre
> svakog bajta, dok 'h' (posle bajta) nije potreban, zbog toga sto A86
> kompajler hex brojeve obelezava nulom ispred broja. Pored toga, trebalo bi
> samo smanjiti broj tih bajtova u jednom redu sa 20 na 15. :)
Evo ti mog programa BIN2TXT koji sam napisao još 1995 za svoje potrebe.
Pruža ti mogućnost podešavanja ispisa BYTE-a, WORD-a i DWORD-a, takođe biraš
kolika je tabulacija i broj podataka u redu. Postoji i mogućnost izbora od kog
bajta iz datoteke da počne sa čitanjem itd.
Probaj, ovo će ti verovatno rešiti problem.
Naravno moras preusmeriti ispis u datoteku sa '>'.
bin2txt.exeasembler.408vector,
Koji je najbrzi nacin za prenos nekoliko K sa jedne memorijske lokacije
na drugu? Da li je u pitanju `rep movsw'?
asembler.409mdimitrijevic,
> Koji je najbrzi nacin za prenos nekoliko K sa jedne memorijske lokacije
> na drugu? Da li je u pitanju `rep movsw'?
REP MOVSD ukoliko koristiš 386+ procesor. Inače REP MOVSW. Moguće je
ponekad ostvariti veće brzine ukoliko koristiš STOSD i petlju sa CX, ali to
zavisi od onoga što pokušavaš da uradiš. Jer ukoliko radiš filovanje 3D objekta
može se desiti da ti adresa koju puniš sa REP MOVSB bude na neparnom broju u
kom slučaju imaš malo usporenje itd. A i ovo zavisi da li se radi o 386+ ili o
Pentiumu. Takođe treba se osloniti na to da adresa rutine bude na parnoj adresi
jer će u slučaju ulaska u keš procesora mnogo brže da se izvršava. Ovo se sve
odnosi na pisanje DEMO-a gde ti je važna brzina do maximuma. Takođe sam na ovaj
način pisao jedan komercijalni program za puštanje animacija gde je trebalo
puštati animacije u visokoj rezoluciji (VESA 2.0) uz najmanje moguće usporenje
tj. uz najveću moguću brzinu (uz korišćenje linearne memorije VESA 2.0).
asembler.410jjerry,
>>Jer ukoliko radis filovanje 3D objekta
>>moze se desiti da ti adresa koju punis sa REP MOVSB bude na
>>neparnom broju u kom slucaju imas malo usporenje itd.
Pojasni malo :) posto sam video mnogo onih demo-a koje spominjesh
sa interesantnim 3D objektima,pa me malo interesuje :)
Pozdrav!
§JţÔÔśř
asembler.411mdimitrijevic,
>>> Jer ukoliko radis filovanje 3D objekta
>>> moze se desiti da ti adresa koju punis sa REP MOVSB bude na
>>> neparnom broju u kom slucaju imas malo usporenje itd.
>
> Pojasni malo :) posto sam video mnogo onih demo-a koje spominjesh
> sa interesantnim 3D objektima,pa me malo interesuje :)
Pojasni šta da pojasnim :) Interesuje te kako se radi filovanje 3D
poligona ili uopšte kako se rade kompletne rutine ?
Što se onog gore tiče (citiranog), radi se o tome da umesto MOVSB treba
da piše STOSB (lapsus tastaturis) i o tome da se parnim adresama brže pristupa
tako da ako pišeš brzu rutinu za 3D filovanje uradiš ALIGN na parnu adresu tako
će i sama petlja biti mnogo brža a i deo za filovanje može da upadne ceo u
interni keš (ovo se najviše odnosi na Pentium, ali se ovakve optimizacije rade
od 386 do Pentiuma). Takođe se rutine pišu tako da se podese na odgovarajući
način da bi keš procesora u najvećem broju pristupa nalazio baš onu naredbu
koju treba. To mi je malo teško da objasnim.
Itd....
asembler.412jjerry,
>>> Pojasni malo :) posto sam video mnogo onih demo-a koje spominjesh
>>> sa interesantnim 3D objektima,pa me malo interesuje :)
>>
>> Pojasni sta da pojasnim :) Interesuje te kako se radi
>>filovanje 3D poligona ili uopste kako se rade kompletne rutine ?
Ma samo filovanje 3D poligona...izgleda mnogo interesantno,posto
nikad nisam pravio 3D animaciju svojim rendererom :)
>> Sto se onog gore tice (citiranog), radi se o tome da umesto
>>MOVSB treba da pise STOSB (lapsus tastaturis) i o tome da se parnim
>>adresama brze pristupa
Razumelo se :) Btw. zashto se parnim adresama brzhe pristupa ?
Pozdrav!
§JţÔÔśř
asembler.413mdimitrijevic,
>>> Pojasni sta da pojasnim :) Interesuje te kako se radi
>>> filovanje 3D poligona ili uopste kako se rade kompletne rutine ?
>
> Ma samo filovanje 3D poligona...izgleda mnogo interesantno,posto
> nikad nisam pravio 3D animaciju svojim rendererom :)
Ovoga sam se plašio :) Filovanje 3D poligona je poprilično kompleksna
oblast ako pričamo o matematički pravilnom filovanju tj. pravom osvetljenju i
teksturisanju. Ne samo što je takvo izračunavanje kompleksno već je i zahtevno
što se vremena tiče. Ali to već znaš s obzirom da radiš sa programima za
animaciju.
No da se prebacim na fazon DEMO-a i INTRO-a. Prednost takvih programa
je što unapred znaju sadržaj scene koju će obrađivati tj. scena je pripremljena
na način na koji će se rutina za 3D najbolje iskazati. Tako recimo vrši se
prekalkulisanje normala, pripremanje kompletne putanje objekata unapred itd.
Sve se to uradi pre početka filovanja i onda se samo u svakom prolazu koriste
prekalkulisane vrednosti.
Postoji kao što znaš obično FLAT filovanje koje se ujedno i najlakše
radi. Njega prosto vršiš sa REP STOSB (STOSW, STOSD zavisi) po horizontalnim
linijama jer je to najbrži način. Pokupe se vrednosti za početnu i krajnju
X kordinatu (to jest povuče se horizontalna linija između dve stranice trougla)
i jednostavno je filuješ sa REP STOSB. No ovo se može vršiti sa prikupljanjem
početnih i krajnjih X kordinata posebno za sve tri linije ili u jednoj petlji
preći za sve slučajeve odjednom no to zavisi od toga kakva je rutina za
filovanje.
E da, koristi se trougao kao osnova za sve kompleksnije poligone jer
je to najmanji oblik koji definiše jednu ravan, tako da sa tri tačke imamo sve
što je potrebno za posmatranje poligona u 3D. Da ne pominjem što je filovanje
trouglova mnogo brže nego mnogouglova.
Onda ima GOURAUD senčenje koje može dosta lepo da izgleda ako se
pripremi dobra paleta (ranije je u DEMO-ima GOURAUD senčenje poturano kao
PHONG)
GOURAUD senčenje se može uraditi na više načina i to zavisi od toga koliko
vremena želimo da uštedimo. Ja ću reći samo da se kod ovog senčenja izračuna
ugao pod kojim pada svetlost na svaku od tri normale na tačke trougla u
prostoru. Onda se filuje kao i FLAT samo se interpolacijom dolazi do boje za
svaku tačku poligona tj. uradi se prelaz od početne do krajnje boje u
horizontalnoj liniji trougla. Naravno paleta mora biti pripremljena da sadrži
boje od najtamnije do najsvetlije ili obrnuto. Naravno sve ovo primenjeno na
texture mapping se vrši preko indeksa u paleti da bi se dobilo senčenje
tekstura, no da batalimo to.
PHONG senčenje je već nešto zanimljivo. Ono predstavlja izračunavanje
ugla pod kojim pada svetlost na SVAKU tačku poligona. Samim tim se dobija
potpuna realnost senčenja. Da bi se postigla brzina, to se ne radi :) već se
primenjuju preračunavanja koja omogućavaju da se delimičnim gubljenjem na
preciznosti (svođenjem na manji broj decimala) dođe do brzine.
Sve ovo postaje mnogo komplikovanije kada se razmisli o tome da se
različiti materijali ponašaju potpuno različito tj. različito odbijaju
svetlost,
poseduju refleksiju i imaju različite teksture.
METAL senčenje je otprilike običan PHONG samo sa malo promenjenom
formulicom za izračunavanje odbljeska. METAL se često koristi sa nekom mapom
refleksije.
No, pravi programi za 3D modeliranje i senčenje trude se da sve
navedene osobine materijala i svetla izračunaju što preciznije. Naravno, jasno
je da oni to ne rade baš uvek dobro, jer i ti programi moraju da štede na
vremenu koliko je moguće.
Dobru primenu optimizacije možemo da vidimo kod 3D Studio MAX-a koji
ima mogućnost prikaza scene u prozoru kao GOURAUD senčenje sa više izvora
svetla. No siguran sam da bi sve to moglo još brže da se napiše ;)
Ma, ubio bih se kada bih morao da sve ovo objašnjavam. Najlepša stvar
kod svih ovih rutina je da se pronađe način da se senčenje izvede što brže, a
da se eventualni propusti sakriju. Potrebno je mnogo mozganja da se izmisli
način da nešto uradiš brže u asembleru. U to spadaju brojanje clock-ova po
rutinama, align podataka na parne adrese (što i nije toliko značano kod
Pentiuma, jer njegov cache radi malo unapred tj. vrši procesiranje više
instrukcija odjednom, što onda za sobom povlači takvo preuređivanje redosleda
naredbi koje bi dovelo do toga da se jedna za drugom postave instrukcije koje
mogu zajedno da uđu u procesiranje), pisanje rutina (petlji) tako da upadnu u
cache. Recimo dok sam jedno vreme razvijao svoju rutinu za 3D, sva merenja sam
radio na nivou milisekundi. Tako da sam kod većih scena, kod manjih izmena,
imao
ogromna ubrzanja. Itd, itd ...
> Razumelo se :) Btw. zashto se parnim adresama brzhe pristupa ?
Verovao ili ne, ne mogu da se setim zašto se brže pristupa parnim
adresama odnosno deljivim sa 2/4/8. Očigledno više ne mogu sve da popamtim :(
Ali, setiću se već.
P.S. Sve što sam napisao je VRLO nedorečeno, ali toliko opširna tema ne može
tek tako lako da se napiše.
asembler.414jjerry,
10x
Quote bi mnogo mesta zauzeo..
Btw. poznate su mi sve tehnike senchenja..samo mi nije bilo jasno
kako se prikazuje uopshte to shto filujesh..
Poz.
§JţÔÔśř
asembler.415jolicm,
Zdravo narode .
trebaju mi saveti za rad programa u zaštićenom modu rada procesora.
Naime napravio sam davno ASM rutine za indeksiranje za Clipper
programski jezik, ali kada hoću rad u zaštićenom modu, glavni program
u Clipperu pukne na mojoj ASM rutini. :(
Upomoć ljudi !
asembler.416mdimitrijevic,
> Btw. poznate su mi sve tehnike senchenja..samo mi nije bilo jasno
> kako se prikazuje uopshte to shto filujesh..
Filovanje uopšte nije problem. Zamisli da imaš dva niza:
startx[200] i endx[200] (u startu su ti sva polja niza startx popunjena sa 320
ili većim brojem (sve zavisi od rezolucije u kojoj ti radi rutina, tako da i
umesto 200 treba veći broj da bi primio sve moguće Y kordinate), dok endx
popuniš sa -1.
Iskoristi bilo koju rutinu za crtanje linija samo umesto da iscrtaš
tačku, upiši (recimo da su kordinate tačke X i Y) ovako:
startx[Y]=X ili endx[Y]=X u koju ćeš upisati zavisi od toga da li je
Y kordinata druge tačke linije veća ili manja od Y kordinate prve tačke linije.
Ako je manja druga Y kordinata onda upisuješ u startx. Zašto je to tako. Svi
poligoni su kreirani tako što su linije (tačke) koje ih definišu u smeru
kazaljke sata. Inače ako su u suprotnom smeru onda to znači da se one ne vide
tj. da svetlost ne pada direktno na poligon. Ovo je malo uprošćeno objašnjenje
ali pomoći će za početak.
E da, važno je da porediš prethodnu vrednost u startx i endx tako što
pre nego što upišeš novu vrednost X, proveriš da li je X manje od startx[Y],
ako jeste upiši novo X ako nije ništa. Isto tako za endx proveravaš da li je
X veće od one upisane za taj Y red.
Naravno ovo se sve odnosi na povlačenje linija kod već projektovanih
3D tačaka u 2D.
Uglavnom posle svega ovoga imaš dva niza kod kojih lepo povučeš
horizontalne linije između startx i endx za svaku Y kordinatu.
Ovo je najprostiji vid i osnova filovanja. Postoje mnogo komplikovanije
rutine koje sve ovo rade u jednoj petlji (nema potrebe za dva niza i ostalim
peripetijama).
Kada se poseduje ovakva rutina za popunjavanje poligona moraju se imati
rutine za projekciju 3D->2D, kontrola i projekcija iz kamere, izvori svetla,
rotacija objekata, kamere, svetla itd. Da ne pominjem texture-mapping.
Sa takvim, osnovnim rutinama koje se mogu naći bilo gde, može se
napisati program koji će da renderuje bilo koju scenu. Problem je "samo" u
tome što bi to bilo očajno sporo (naravno kada bi se sve to uradilo bez pravog
znanja i fenomenalne optimizacije). Kod ozbiljnije rutine uz primenu sasvim
poznatih formula mogao bi se uraditi Raytracing bez problema.
asembler.417stameni,
Malo sam zbunjen sledećim, pa ako neko zna neka viče.
Elem, zna se da je funkcija 4ch interrupta 21h jedan (možda i
jedini) preporučljiv način da se završi program -- sama brine o
otvorenim datotekama, ne zavisi od segmentnih registara, i preko
registra al prosleđuje DOS-u vrednost koja se može dalje obraditi
u batch fileovima itd.
Probao sam da sledeći kratak mašinski program
mov ax, 4c00
int 21
u gornjem obliku ukucam u DOS-ov Debug i u Turbo Debuggere 2.01 i
3.1. Pre pokretanja programa sam očekivao da mi kao rezultat bude
vraćena poruka tipa "Program terminated normally" (uz exit code 0,
razume se), al' jok -- večito bivam puknut u DOS (?) bez ikakvog
objašnjenja.
Da stvar bude misterioznija, probao sam da sa Borlandovim Turbo
Pascalom 6.0 (instrukcija halt) i C++ 3.1 (naredba return), posle
kompajliranja, naravno, ispitam kako se oni ponašaju kod gornje
funkcije, i pokazalo se da je i Borland koristi, ali uspešnije od
mene, jer se program završi baš "kako treba".
DOS je 6.2 sa 4DOS-om 5.5, a isprobano je i sa (skoro) čistim
DOS-om, pod gorenavedenim debuggerima. Šta se to dešava?
asembler.419mdimitrijevic,
> Treba mi neko ko zna da skine zastitu HardLock.
Ovo će ići malo teže. A i "protivzakonito" je :)
> Ukoliko je to ne predstavlja problem, moze li neko da mi
> objasni na Mail kako se to radi.
Da bi se skinula HardLock zaštita potrebno je malo više znanja od onog
koje se može dobiti preko Mail-a. Previše je to kompleksan i zahtevan posao
da bi ga se neko prihvatio. Naravno, uvek se može desiti da je zaštita vrlo
prosta, ali je to malo teži slučaj.
Mogao bi da se raspitaš da li je neko već skinuo zaštitu sa tog
programa pa da iskoristiš već urađen CRACK fajl.
asembler.420zdravkod,
Kako da procitam vrednost iz BS:BX?
Zdravko
asembler.421zdravkod,
DS:BX Greska, izvinjavam se.
asembler.422stameni,
>> DS:BX Greska, izvinjavam se.
Zavisi od toga šta se nalazi u DS:BX. Ako je u pitanju samo
neka vrednost u registru, jednostavno kažeš MOV AX, BX. Ako bi
hteo da pročitaš 16-bitnu vrednost koja je na adresi DS:BX, kažeš
MOV AX, [BX] (bez potrebe za inicijalizacijom registra DX, koji bi
prema tome što kažeš već bio postavljen). Itd.
Da ne bih sada nabrajao sve adresne modove, ako do sada nije
jasno, navedi malo preciznije šta bi hteo da uradiš, pa da
vidimo...
asembler.423zdravkod,
Koliko ja razumem u DS:BX se nalazi dword, valjda doubleword,
odnosno 32bit vrednost.
Zdravko
asembler.424stameni,
>> Koliko ja razumem u DS:BX se nalazi dword, valjda doubleword,
>> odnosno 32bit vrednost.
Posle ovoga:
MOV AX, DS
SHL EAX, 16D
ADD AX, BX
u EAX biće upisana vrednost DS:BX.
asembler.425stameni,
Ovo ' D' je oznaka da je u pitanju dekadni, a ne heksadekadni
sistem!
asembler.426zdravkod,
Kad otkucam to i pokusam da kompajliram (inace pisem u pascalu u
asm odeljku) kaze mi "Unknown identifier za EAX.
Zdravko
asembler.427stameni,
>> Kad otkucam to i pokusam da kompajliram (inace pisem u pascalu u
>> asm odeljku) kaze mi "Unknown identifier za EAX.
Greška nastaje jer kompajler nema pojma o tom registru (koji,
inače, postoji na 386+). Možda upali stavljanje sviča $G na "on"
($G+, mada sumnjam), ali ako radiš u Pascalu, imaš ovo rešenje:
uses
dos;
function obradi(var r: registers): longint;
begin
obradi := r.ds * 65536 + r.bx
end;
Može se naterati komapajler da sažvaće i EAX registar pomoću
inline mašinskog koda, mada mislim da za tim nema potrebe.
U C-u bi trebalo da se mogu koristiti i promenljive _AX, _BX i
slične.
asembler.428zdravkod,
Bojim se da ni ov ne pomaze... Ceo problem se sastoji u tome da
hocu da iscitam serijski broj hard diska. Kad pozovem funkciju 69
interapta 21 u HELPPC-u kaze da serijski broj vraca u DS:DX.
Pokusao sam mali milion nacina, ali svaki put mi ispise neke
nebuloze. Evo saljem i program ako ce to da pomogne...
Zdravko
ds_dx.pasasembler.429stameni,
>> Bojim se da ni ov ne pomaze... Ceo problem se sastoji u tome da
>> hocu da iscitam serijski broj hard diska. Kad pozovem funkciju 69
>> interapta 21 u HELPPC-u kaze da serijski broj vraca u DS:DX.
Mislim da si mi ovom porukom razjasnio mnoge stvari. Elem, u
pitanju je registarski par koji sadrži pokazivač na strukturu.
Dakle, treba čitati memoriju adresiranu registrima, a ne samu
vrednost registara. Ta struktura, piše u HELPPC-u i u Interrupt
Lists, od ofseta 2 sadrži jednu četvorobajtnu promenljivu (dword)
koja posle poziva prekida biva napunjena sa osam binarno kodiranih
cifara, a to je ono što nam treba.
Binarno kodiranje se sastoji u tome što se u viši polubajt
(nibble) upiše jedna cifra, a u niži polubajt druga cifra. Dakle,
potrebna nam je i jedna konverziona rutina iz dekadnog u
heksadekadni sistem. Heksadekadni broj će biti niska (string)
dužine 2.
Kako obezbediti memoriju za DS:DX registarski par? Ima više
načina. Jedan je da se napravi promenljiva tipa string dužine 24
bajta (jer je tolika ukupna dužina potrebne memorijske strukture),
i onda proslediti njen segment i ofset registrima DS i DX. Nakon
pozivanja prekida taj string će biti promenjen, nakon toga čitamo
bajtove na ofsetima 5, 4, 3 i 2 i jedan po jedan konvertujemo ih u
nisku, koju na kraju prikažemo. I to je to. Evo programa:
----<cut>----
program DiskSerialNumber;
{$R+}
uses
dos;
function Dec2Hex(x: byte): string;
var
ret: string[2];
begin
case x div 16 of
0..9: ret := chr((x div 16) + 48);
10..15: ret := chr((x div 16) + 55)
end;
case x mod 16 of
0..9: ret := ret + chr((x mod 16) + 48);
10..15: ret := ret + chr((x mod 16) + 55)
end;
Dec2Hex := ret
end;
function GetDiskSerialNumber(drive: byte): string;
var
r, s: string[24];
regs: registers;
begin
s := '';
regs.ah := $69;
regs.al := $00;
regs.bl := drive;
regs.ds := seg(s);
regs.dx := ofs(s);
MsDos(regs);
if regs.flags and FCarry = 0 then
r := Dec2Hex(ord(s[5])) + Dec2Hex(ord(s[4])) + ':' +
Dec2Hex(ord(s[3])) + Dec2Hex(ord(s[2]));
GetDiskSerialNumber := r
end;
begin
writeln(GetDiskSerialNumber(0))
end.
----<cut>----
Argument koji se prosleđuje funckiji za nalaženje serijskog
broja je 0 za tekući drajv, 1, za A:, 2 za B: itd.
Probaj ovo, pa ako ima nejasnoća ti viči.
asembler.430ksanyi,
Hi!
Dali neko ima funkciju za računanje tangensa hiperboličkog?
Unapred hvala!
asembler.431zdravkod,
Kako da skocim na neku odredenu adresu u memoriji. Konkretno treba
da skocim na FFFF:0000.
Zdravko
asembler.432jjerry,
Shta to hocesh da uradish ? Resetujesh kompjuter ? Sorry jerbo se
ne secam :( ali sam siguran da je vec bilo ovde negde,mozda cak ni
ne tako davno.
asembler.433zdravkod,
Jel moze neko da mi objasni kako da iz nekog asembler programa
pozovem negi drugi .COM program (na foru ucitam ga u memoruju i
onda skocim na pocetak tog programa u memoriji). Ovo sam probao i
kompjuter se zablokira. U najboljem slucaju program se izvrsi pa
onda ispise neke brljotine po ekranu pa onda zablokira. Ako moze
detaljnije objasnjenje...
Zdravko
asembler.434mdimitrijevic,
> Jel moze neko da mi objasni kako da iz nekog asembler programa
> pozovem negi drugi .COM program (na foru ucitam ga u memoruju i
> onda skocim na pocetak tog programa u memoriji). Ovo sam probao i
> kompjuter se zablokira. U najboljem slucaju program se izvrsi pa
> onda ispise neke brljotine po ekranu pa onda zablokira. Ako moze
> detaljnije objasnjenje...
Taj COM program moraš da učitaš na adresu CS:0100h gde ti je CS segment
u koji si učitao COM fajl. Takođe DS, ES, SS, CS moraju pokazivati na isti
segment tj. onaj koji si rezervisao za COM fajl. SP može da bude FFFE.
Takođe postoji dosta programa koji proveravaju svoj PSP (na primer u potrazi
za podacima iz komandne linije) tako da bi valjalo da ga kreiraš. E da, pošto
treba da pozivaš neki drugi program onda moraš da sačuvaš SVE (najbolje je)
registre pre JMP-a na početak COM programa, i da ih vratiš na kraju. Isto
tako potrebno je da preuzmeš npr. INT 21h funkciju 4Ch da bi sačekao završetak
programa i vratio sve kako je i bilo. E sad, ima nekih programa koji izlaze
sa RET, a ima (verovatno negde na svetu :) i programa koji izlaze preko INT 21h
funkcija 0 ili preko Int 20h, no ovo je zastareli metod.
Čuvanje registara je važno ako treba da se iz pozvanog programa
'vratiš' u svoj.
E sad, nešto sam sigurno zaboravio, ali mnogo je to različitih
informacija da bih se svega setio.
S obzirom da je ovo gore navedeno komplikovaniji način, a
pretpostavljam da nisi baš profesionalac, mogao bi da se pozabaviš DOS
funkcijom, naravno, INT 21h 4Bh kojoj prosleđuješ način na koji hoćeš da se
učita program (da se učita, da se učita i izvrši pa onda vrati u tvoj program,
da se učita i kreira PSP itd. tako neke kombinacije), pointer na ime programa i
pointer na nekakve parametre.
Valjalo bi da imaš neki pregled interapta. Ukoliko nemaš predlozio bih
ti da skineš sa Sezama. HELPPC, TECH HELP, DOS REFERENCE itd. su dobri.
Sve navedeno pišem napamet, tako da ne zameri na eventualnoj grešci.
Ako malo pobliže objasniš šta konkretno hoćeš (da li želiš da se,
posle startovanja COM programa 'vratiš' u svoj ili da taj program prezume
komandu itd.
asembler.435zdravkod,
Pa potrebno mi je samo startovanje tog programa, dakle onaj program
koji se startuje treba da preuzme potpunu kontrolu... Takode je
vazno da se ne koriste DOS interapti. Bio bih zahvalan ako bi mogao
da napises primer, jer nisam bas vest sa assemblerom i ne verujem
da bi mogao da izvedem sve ono sto si naveo u prethodnoj poruci...
Zdravko
asembler.436mdimitrijevic,
> Pa potrebno mi je samo startovanje tog programa, dakle onaj program
> koji se startuje treba da preuzme potpunu kontrolu... Takode je
> ....
> da napises primer, jer nisam bas vest sa assemblerom i ne verujem
> da bi mogao da izvedem sve ono sto si naveo u prethodnoj poruci...
A da ti objasniš za šta ti konkretno treba da pozivaš iz svog
asemblerskog neki COM program.
Možda postoji lakši način da se reši tvoj problem.
asembler.437zdravkod,
Pa, ovako... Zeleo bih da taj .COM program upisem u boot sector. U
boot sector moze da se upise samo program duzine do 512 bajtova.
Moja namera je da taj program u boot sectoru ucita u memoruju neki
drugi program vece duzine i da ga izvrsi, tj preda mu potpunu
kontrolu...
Zdravko
asembler.438mdimitrijevic,
> Pa, ovako... Zeleo bih da taj .COM program upisem u boot sector. U
> boot sector moze da se upise samo program duzine do 512 bajtova.
> Moja namera je da taj program u boot sectoru ucita u memoruju neki
> drugi program vece duzine i da ga izvrsi, tj preda mu potpunu
> kontrolu...
Aha, samo da se nisi malo zaleteo ? Ako si već početnik onda je
nemoguće da bi nešto slično mogao da uradiš.
Opisaću ti neke stvari koje su važne oko takve jedne rutine, ali
naglašavam da pišem napamet, tako da ako ima grešaka ne zamerite.
To što ti želiš rade virusi. Odmah da napomenem da viruse nije teško
napisati, teško je napisati dobre viruse :) E sad, u trenutku startovanja
boot sectora DOS nije startovan, samim tim ne postoji način da se lako
pročita neki fajl sa diska i učita u memoriju. Morao bi da znaš gde se tačno
(fizički) na disku nalazi početak fajla da bi ga pročitao preko na primer
Int 13h (BIOS poziva). Moguće je naći poziciju fajla tako što preko direktnog
čitanja diska (uz poznavanje struktura svih DOS tabela na disku) nađeš traženi
fajl. Ovo bi teško strpao u 512 bajtova (u to bi trebalo da stane i učitavanje
itd.).
Virusi to rešavaju na taj način što kod virusa strpaju negde na disk
(na poziciju koja je nepromenjiva) pa onda po čitanju boot sectora pročitaju
taj kod i izvrše ga. Pa preuzimaju Int 13h da bi poturali pravi boot sectoru
programima koji ga čitaju itd. itd. ...
E sad, da ne razvlačim priču, pošto bi nekako uspeo da startuješ taj
COM program, on bi morao da nastavi sa podizanjem sistema, jer, logično, ako
sistem nije podignut onda nema ništa od rada na kompjuteru. Podizanje
sistema opet ima neke svoje cake.
Sve u svemu, ne isplati se da se baviš ovim, osim ako te baš ne
interesuje pravljenje virusa :)
Ako ti za neku stvar baš treba ovakav program, reci o čemu se radi,
možda neko ima program koji bi mogao da ti pomogne.
Pravo da ti kažem, da imam dovoljno vremena, bilo bi mi pravo
zadovoljstvo da se ponovo pozabavim asemblerom i uradim ti ovaj program.
asembler.439zdravkod,
Da, svestan sam svih komplikacija itd... Stvar je u tome da ja ne
zelim da pravim virus!!! Cak ne zelim da ucitavam DOS...
Jednostavno, poenta je u tome da hocu da na ovaj nacin, pri
bootovanju, startujem jedan programcic koji je malo veci od 512
bajtova...
P.S: I nisam bas toliki novajlija...
asembler.440mdimitrijevic,
> zelim da pravim virus!!! Cak ne zelim da ucitavam DOS...
> Jednostavno, poenta je u tome da hocu da na ovaj nacin, pri
> bootovanju, startujem jedan programcic koji je malo veci od 512
> bajtova...
Napisao sam koje su komplikacije da se tako nešto uradi. Ako bi recimo
radio preko diskete (mada može i preko hard diska) koja bi bila specijalno
pripremljena da uradi samo ovu stvar, bilo bi malo lakše.
Mogu da pokušam da nađem neki primer boot sectora koji radi raznorazne
stvari. Mislim da ga, negde na disketama, imam, ali ...
Ako radiš sa konkretnim vrednostima, napišeš boot sector koji čita,
sa neke "fizičke" adrese, sa diska seriju bajtova COM programa na početak nekog
segmenta i to na ofset 0100h, zbog skokova, petlji itd. Primeniš ona pravila
koja sam napisao u nekoj od prethodnih poruka. Onda na kraju boot sectora
skočiš (sa JMP seg:0100h) na tu adresu i to je to.
Znaš i sam da u takvom COM programu nema DOS funkcija i ostalih
lepota. Taj COM program bi morao pažljivije da se napiše. E sad, pošto se
posle boot sectora neće startovati, DOS, Windows, Unix ili bilo koji drugi,
operativni sistem onda je sasvim proizvoljna segment adresa na koju ćeš učitati
željeni program. Takodje ne moras da brines o ostalim zajebancijama oko
podizanja operativnog sistema.
Kada snimaš na disketu ili hard rutinu koja će se startovati, moraš da
paziš da se Int 13h i DOS sektori itd. ne poklapaju.
Takođe možeš da snimiš fajl pod običnim DOS-om, pročitaš gde se
"fizički" na disku nalazi serija bajtova (COM program) i ugradiš ih pravo u
rutinu u boot sectoru.
> P.S: I nisam bas toliki novajlija...
OK, olako sam ocenio ko je novajlija, a ko nije.
asembler.441mdimitrijevic,
> Mogu da pokušam da nađem neki primer boot sectora koji radi raznorazne
> stvari. Mislim da ga, negde na disketama, imam, ali ...
Naš'o nešto slično. Primer je u C-u pa nemam pojma koliko će ti pomoći :(
Ovo je primer, iz PCINTERN kolekcije rutina, koji formatira disketu i
upisuje svoj boot sector sa porukom o autoru itd.
Primer bi mogao da iskoristiš kao osnovu za upis tvog boot sectora. Samo
obriši poziv funkcije koja formatira i ostavi deo za upis boot sectora.
Primer ne radi sa hard diskom.
dfc.zipasembler.442stameni,
>> Ovo je primer, iz PCINTERN kolekcije rutina, koji formatira disketu i
>> upisuje svoj boot sector sa porukom o autoru itd.
Može li se saznati nešto više o ovim rutinama? Koliko to
zauzima kad bi se slalo na Sezam -- ne videh po direktorijumima
nešto što se slično vika, a izgleda da je fina stvar...
U posedu sam Interrupt Lists 5.3, skinuto čini mi se sa CD-ova
koje prodaje SezamPro, a ovde je valjda poslednja verzija 5.1; da
li je potrebno da šaljem novu verziju? Mislim da razlike nisu baš
bitne...
asembler.443mdimitrijevic,
> Može li se saznati nešto više o ovim rutinama? Koliko to
> zauzima kad bi se slalo na Sezam -- ne videh po direktorijumima
> nešto što se slično vika, a izgleda da je fina stvar...
Može da se sazna, a može i da se dobije :))
Ima nekoliko zanimljivih primera za početnike i za napredne programere.
Sorsovi su u C-u i ASM-u.
pcintern.zipasembler.444stameni,
>> Može da se sazna, a može i da se dobije :))
Hvala :) Deda Mraz ima iste inicijale kao ti :)
asembler.445mdimitrijevic,
>>> Može da se sazna, a može i da se dobije :))
>
> Hvala :) Deda Mraz ima iste inicijale kao ti :)
Prepoznao si me :))) Moraću da menjam username :)
Volim da pomognem ako mogu. Vidim da se datoteke koje sam slao u ovu konfu
uveliko skidaju (i one ranije i ove nove). Drago mi je da je tako.
asembler.446zdravkod,
Kako da iscitam Boot sector hard diska-a?! Probao sam sa
interaptima 13 i 25 i oni dobro rade kada je u pitanju diskata,
medutim kad hocu da na isti nacin da iscitam sa harda vracaju mi
neke gluposti...
Zdravko
asembler.447jujo,
# Kako da iscitam Boot sector hard diska-a?! Probao sam sa
# interaptima 13 i 25 i oni dobro rade kada je u pitanju diskata,
# medutim kad hocu da na isti nacin da iscitam sa harda vracaju mi
# neke gluposti...
# Zdravko
Pa stavi kao broj diska 0x80 (za PRVI HD U SISTEMU) a ne 2 ili tri kako
pretpostavljam
asembler.448zdravkod,
Nisam pravio tu gresku... Kod Int 25 je za hard disk 2, dok je ovde
80h... Sigurno je sve dobro, ali on mi uporno vraca Invalid Media
Type..
Zdravko
asembler.449jujo,
# Nisam pravio tu gresku... Kod Int 25 je za hard disk 2, dok je ovde
# 80h... Sigurno je sve dobro, ali on mi uporno vraca Invalid Media
# Type..
# Zdravko
Evo ti prog koja sam ja pisao pa vidi gde si se izradio. Ovo je C verzija
jer neznam gde sam stavio ASM verziju... ali su kljucni delovi u ASM-u
Ovo je pisano za BC 3.1
=============================================================================
#include <dos.h>
#include <bios.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define PART1 0x01be
#define PART2 0x01ce
#define PART3 0x01de
#define PART4 0x01ee
#define BYTE unsigned char
#define WORD unsigned short
#define DWORD unsigned long
typedef struct { BYTE BootIndicator;
BYTE bgSector;
BYTE bgSectorH;
BYTE bgCylinder;
BYTE SystemIndicator;
BYTE edSector;
BYTE edSectorH;
BYTE edCylinder;
DWORD numSecP;
DWORD numSec;
} BIOS_PARTITION;
typedef struct { int shead;
int scyl;
int ssec;
int ehead;
int ecyl;
int esec;
} PARTITION;
typedef struct { BYTE boots[512];
BIOS_PARTITION *p[4];
PARTITION pp[4];
int nhead, ncyl, nsec;
int drivenum;
} DRIVE;
typedef struct { char name[15];
int id;
} SYSTEMS;
SYSTEMS sys[]=
{
{"UNKNOWN ", 0 }, {"DOS12 ", 1 },
{"XENIX ", 2 }, {"XENIX ", 3 },
{"DOS16 ", 4 }, {"EXTEND ", 5 },
{"BIGDOS ", 6 }, {"HPFS ", 7 },
{"SPLIT ", 8 }, {"BootMgr ",0x0a },
{"DM ",0x50 }, {"NOVELL ",0x51 },
{"GB ",0x56 }, {"SPEED ",0x61 },
{"NET286 ",0x64 }, {"NET386 ",0x65 },
{"PCIX ",0x75 }, {"Linux ",0x83 },
{"CP/M ",0xdb }, {"BBT ",0xff },
{"NULL ", -1 }
};
DRIVE drv[4];
SYSTEMS *getSystem(int s)
{
int i;
for (i=0;;i++)
{
if (strcmp(sys[i].name, "NULL ")==0) return sys;
if (sys[i].id==s) return sys+i;
}
}
int makeSector(int p1, int p2)
{
return p1 | (p2 & 63);
}
int makeCyl(int p1, int p2)
{
return p2 | ((p1 & 192)<<2);
}
void calculateDrive(DRIVE *d, int maxhead)
{
int i;
int boot, ssec, scyl, esec, ecyl;
long rsec, tsec;
for (i=0; i<4; i++)
{
ssec=makeSector(d->p[i]->bgSector, d->p[i]->bgSectorH);
scyl=makeCyl(d->p[i]->bgSectorH, d->p[i]->bgCylinder);
esec=makeSector(d->p[i]->edSector, d->p[i]->edSectorH);
ecyl=makeCyl(d->p[i]->edSectorH, d->p[i]->edCylinder);
d->pp[i].shead= i==0 ? 1:0;
d->pp[i].ehead= maxhead-1;
d->pp[i].ssec= ssec;
d->pp[i].esec= esec;
d->pp[i].scyl= scyl;
d->pp[i].ecyl= ecyl;
}
}
void getDriveParams(int drive)
{
int sec, cyl, head=0;
asm { push ax;
push bx;
push cx;
push dx;
push di;
push es;
clc;
xor ax, ax;
mov ah, 0x08;
mov dx, drive;
add dx, 0x80;
int 0x13;
mov ax, cx;
and ax, 0x3f;
mov sec, ax;
mov byte ptr head, dh
inc head
mov ax, cx; /* ax=cx */
xor ah, ah; /* ah=0 */
shl ax, 2 /* */
mov al, ch /* */
add ax, 1
mov cyl, ax; /* */
pop es;
pop di;
pop dx;
pop cx;
pop bx;
pop ax;
}
drv[drive].nsec=sec;
drv[drive].ncyl=cyl;
drv[drive].nhead=head;
}
void readPart(int drive)
{
int res;
res=biosdisk (_DISK_READ, 0x80+drive, 0,0,1,1,drv[drive].boots);
drv[drive].p[0]=(BIOS_PARTITION *)(drv[drive].boots+PART1);
drv[drive].p[1]=(BIOS_PARTITION *)(drv[drive].boots+PART2);
drv[drive].p[2]=(BIOS_PARTITION *)(drv[drive].boots+PART3);
drv[drive].p[3]=(BIOS_PARTITION *)(drv[drive].boots+PART4);
drv[drive].drivenum=drive;
getDriveParams(drive);
calculateDrive(&drv[drive], drv[drive].nhead);
}
void showPartition(char *m,
int boot, char *system,
int ssec, int scyl,
int esec, int ecyl,
long rsec, long tsec)
{
printf("\n%s%s", m, boot==0x80 ? "* ": " ");
printf(" %s", system);
printf("| %5d", ssec);
printf(" %5d |", scyl);
printf(" %5d", esec);
printf(" %5d |", ecyl);
printf(" %8lu ", rsec);
printf(" %8lu |", tsec);
printf(" %-8.2fMb", tsec/2.0/1024.0);
}
void showPartTable(DRIVE *d, char *mm);
void showLogicalPartition(int drive, int part)
{
DRIVE d;
int head, sec, cyl;
int res;
res=biosdisk (_DISK_READ, 0x80+drive,
drv[drive].pp[part].shead,
drv[drive].pp[part].scyl,
drv[drive].pp[part].ssec,
1, d.boots);
d.p[0]=(BIOS_PARTITION *)(d.boots+PART1);
d.p[1]=(BIOS_PARTITION *)(d.boots+PART2);
d.p[2]=(BIOS_PARTITION *)(d.boots+PART3);
d.p[3]=(BIOS_PARTITION *)(d.boots+PART4);
calculateDrive(&d, drv[drive].nhead);
showPartTable(&d, ">");
}
void showPartTable(DRIVE *d, char *mm)
{
SYSTEMS *s;
int i;
int boot, ssec, scyl, esec, ecyl;
long rsec, tsec;
for (i=0; i<4; i++)
{
s=getSystem(d->p[i]->SystemIndicator);
boot=d->p[i]->BootIndicator;
ssec=d->pp[i].ssec;
scyl=d->pp[i].scyl;
esec=d->pp[i].esec;
ecyl=d->pp[i].ecyl;
rsec=d->p[i]->numSecP;
tsec=d->p[i]->numSec;
if (s->id!=0) showPartition(mm, boot, s->name, ssec, scyl, esec, ecyl,
rsec, tsec);
if (mm[0]!='>')
if (s->id==5) showLogicalPartition(d->drivenum, i);
}
}
void showTable(DRIVE *d, char *mm)
{
int i;
printf("\n\nHEAD:%-5d CYL:%-5d SEC:%-5d", d->nhead, d->ncyl, d->nsec );
printf("\nBT System |SSector SCyl |ESector ECyl |RelSector TotSectors|
Size");
showPartTable(d, mm);
}
void main (void)
{
clrscr();
//prvi disk
readPart(0);
showTable(&(drv[0]), "");
// drugi disk
readPart(1);
showTable(&(drv[1]), "");
}
=============================================================================
asembler.450pvlada,
Da li neko može da mi napiše algoritam za generisanje slucajnog (random)
broja ?
Pozdrav Vlada
asembler.451obren,
> Da li neko može da mi napiše algoritam za generisanje slucajnog
> (random) broja ?
Evo ti sors funkcije rand() iz BC-a 3.1 (najprostiji mogući, kongruentni),
pa je prepevaj na ASM pošto je trivijalno.
#include <stdlib.h>
#define MULTIPLIER 0x015a4e35L
#define INCREMENT 1
static long Seed = 1;
/*---------------------------------------------------------------------*
Name srand - initializes random number generator
Usage void srand(unsigned seed);
Description see rand below
Return value Nothing
*---------------------------------------------------------------------*/
void srand(unsigned seed)
{
Seed = seed;
}
/*---------------------------------------------------------------------*
Name rand - random number generator
Usage int rand(void);
Description rand uses a multiplicative congruential random number
generator with period 2^32 to return successive pseudo-
random numbers in the range from 0 to 2^15 - 1.
The generator is reinitialized by calling srand with an
argument value of 1. It can be set to a new starting point
by calling srand with a given seed number.
*---------------------------------------------------------------------*/
int rand(void)
{
Seed = MULTIPLIER * Seed + INCREMENT;
return((int)(Seed >> 16) & 0x7fff);
}
asembler.452speedy,
> Da li neko moze da mi napise algoritam za generisanje slucajnog (random)
> broja ?
>
> Pozdrav Vlada
Mozda bi ti bilo "dovoljno slucajno" da iz PIT-a (tajmer cip koji otkucava
18.2x u sekundi, refresuje memoriju, upravlja zvucnikom...) pokupis
(counter latch) vrednost iz timera 1... Ako ti treba neki primer mailuj
me da prekopam po sorsevima. Za help pogledaj u HelpPC, pcGPE ili nesto
slicno
ili me mailuj da ti to posaljem.
asembler.454sqweaky,
Uz poruku je FAQ o asembleru (tasm, masm... ).
asmfaq.zipasembler.455dule.n,
Ima li neka dobra duša koja zna kako se programiraju video kartice?
Interesuju me rezolucije od 640x480 pa naviše, sa 16 ili 256 boja.
Sa interaptom 10h je sve jasno ali je, naravno, mnogo sporo. Znači,
treba se okrenuti direktnom upisu u video memoriju.
Jasno mi je, principijelno, kako je organizovan pristup video memoriji.
Da je na adresama od A0000 pa sledećih 64k prozor u celu video memoriju
a da se onda upis u željeni deo memorije vrši pomeranjem tog prozora
i upisivanjem "kroz" njega. E, interesuje me kako se sve to odrađuje,
tj. pre svega kako se pomera taj prozor.
Relativno mi je hitno, a bio bih do neba zahvalan onome ko mi razreši
ove nedoumice. :(
asembler.456kojai,
>> Ima li neka dobra dusa koja zna kako se programiraju video kartice?
>> Interesuju me rezolucije od 640x480 pa navise, sa 16 ili 256 boja.
>> Sa interaptom 10h je sve jasno ali je, naravno, mnogo sporo. Znaci,
>> treba se okrenuti direktnom upisu u video memoriju.
Jedini nacin da pokrenes rezoluciju ti je preko interapta 10h...
Ima jos jedan nacin, kojim se moze generisati rezolucija ekrana, ali to
ne znam coveka koji je uradio! :)
Princip je sledeci... Posto nemas pod int 10h SVGA rezolucije, moras da
u al segment upises broj koji zavisi od kartice koje imas... Ako se dobro
secam to je broj 40F..h(ne secam se :)), ali imas ga u vesa.doc, koji mozes
da skines i sa sezama...
Kada pokrenes rezoluciju koju zelis moras da odredis page na koji upisujes
nesto... Znaci ako je page 0 upisujes u A000h i on ce ti ga ispisivati u
prvih 64k ekrana, onda promenis page i ponovo upisujes u narednih 64k...
Tako dok ne iscrtas bitmap!
Ono ako lepo odradis ne radi sporo... Ja sam uspeo da bitmap(1024x768, 256c)
iz video memorije lepim na ekran pri brzini 8 frame/sec...
Pozdrav!
asembler.457dule.n,
│ Jedini nacin da pokrenes rezoluciju ti je preko interapta 10h...
│ Ima jos jedan nacin, kojim se moze generisati rezolucija ekrana, ali to
│ ne znam coveka koji je uradio! :)
└───────────────────
Ma nije problem u postavljanju rezolucije tj. video moda. Tu se uradi
jedno int 10 i gotovo, nece jedan interapt da koči rad, problem je
kad imaš interapt za svaku tačku koju iscrtavaš.
│ Princip je sledeci... Posto nemas pod int 10h SVGA rezolucije, moras da
│ u al segment upises broj koji zavisi od kartice koje imas... Ako se
│ dobro secam to je broj 40F..h(ne secam se :)), ali imas ga u vesa.doc,
│ koji mozes da skines i sa sezama...
└───────────────────
Mislim da je 4fh, probao sam i to ali izgleda da moja video kartica
nije VESA kompatibilna (TSENG ET4000, ISA kartica).
U međuvremenu sam iskopao rešenje za 640x480x16 što mi je zadovoljavajuće
za potrebe koje imam.
U svakom slučaju, hvala ti.
asembler.458kojai,
Imam problem oko inicijalizacije DMA...
Naime nikako ne uspevam kako valja da napisem sve, tako da wave koji pustam
nije wave nego neka brljotina!
Trebaju mi rutine za pustanje vise wavova, ekvilajzere, povecanje i smanjenj:
amplitude, distorzije, cutoff(sa skidanjem visokih)...
Postojao je nekada fajl u kome se nalazilo sve ovo, ja ga nemam :((, a ako ga
neko ima molim ga da posalje, ili ako neko zna kako ovo da resim neka napise
nesto!
Pozdrav!
asembler.459jujo,
# Imam problem oko inicijalizacije DMA...
# Naime nikako ne uspevam kako valja da napisem sve, tako da wave koji
# pustam nije wave nego neka brljotina!
# Trebaju mi rutine za pustanje vise wavova, ekvilajzere, povecanje i
# smanjenj: amplitude, distorzije, cutoff(sa skidanjem visokih)...
#
# Postojao je nekada fajl u kome se nalazilo sve ovo, ja ga nemam :((, a
# ako ga neko ima molim ga da posalje, ili ako neko zna kako ovo da resim
# neka napise nesto!
#
#
# Pozdrav!
Hmmm...pa imas to vec gotovo i lepo zapakovano u npr. MiKMOD-u ili MIDAS-u.
U stvari za koju te platformu interesuje rutina....
yooyo:
asembler.460kojai,
Nema problema saznao sam kako da resim moje muke...
Resio sam to u Direct Soundu pod NT-om!
Mogu da pustam vise wavova itd...
asembler.461jjerry,
Da li neko ima (ili mozhda zna Web na kome postoji) opis VESA
funkcija ? (prelazhenje u 640x480+ modove,crtanje piksela,palete
itd.)
10x
asembler.462dalek,
Da li neko ima masm ili tasm. Ako ima nek mi posalje
hvala
asembler.463jujo,
# Da li neko ima (ili mozhda zna Web na kome postoji) opis VESA
# funkcija ? (prelazhenje u 640x480+ modove,crtanje piksela,palete
# itd.)
#
# 10x
Imam sors ali u C (Watcom...). Javi ako ti mozda moze koristiti...
yooyo:
asembler.464jujo,
# Da li neko ima (ili mozhda zna Web na kome postoji) opis VESA
# funkcija ? (prelazhenje u 640x480+ modove,crtanje piksela,palete
# itd.)
#
# 10x
Imam sors ali u C (Watcom...). Javi ako ti mozda moze koristiti...
yooyo:
asembler.465jjerry,
Kako ne..poshalji samo :)
asembler.466jjerry,
Kako da u asembleru ,odnosno bolje u asemblerskom bloku u okviru
paskala operishem sa fixed-point promenljivama,npr. tipa single ?
asembler.467jjerry,
Opet trazhim info o VESA modovima. Najpozheljnije bi bilo u
asembleru ali u principu mozhe bilo shta sem bejzika.:)
asembler.468jujo,
# Opet trazhim info o VESA modovima. Najpozheljnije bi bilo u
# asembleru ali u principu mozhe bilo shta sem bejzika.:)
Pa u nekom konfu sam poslao vgadoc4b.zip. Potrazi ga..
yooyo:
asembler.469jujo,
# Kako da u asembleru ,odnosno bolje u asemblerskom bloku u okviru
# paskala operishem sa fixed-point promenljivama,npr. tipa single ?
#
Evo ti u C-u. Naravno Watcom, 32bit..
Sabiranje, oduzimanje i poredjenje je isto kao i sa int-ovima (32bit).
#define FIXP long
FIXP FIXPmul(FIXP a, FIXP b);
#pragma aux FIXPmul="imul edx ",\
"shrd eax,edx,16 ",\
parm caller [eax] [edx] value [eax];
FIXP FIXPdiv(FIXP a, FIXP b);
#pragma aux FIXPdiv="xor eax, eax" \
"shrd eax, edx, 16" \
"sar edx, 16" \
"idiv ebx" \
parm caller [edx] [ebx] \
value [eax] \
modify [eax ebx edx];
#define DBL2FIXP(__a) ((__a)*65536)
#define FIXP2DBL(__a) ((__a)/65536.0)
#define INT2FIXP(__a) ((__a)<<16)
#define FIXP2INT(__a) ((__a)>>16)
yooyo:
asembler.470jjerry,
Da li mozhe neko od iskusnijih programera da me uputi malo u
oblasti vezane za protected mode ,odnosno zashticeni rezhim.
Odnosno,konkretnije,kako procesor dolazi u stanje zashticenog
rezhima ili to nije neophodno posebno raditi?
Dalje,shta sve omogucava zashticeni rezhim u odnosu na obichan,tj.
real mode ? Da li je,i zashto potrebno vrshiti real-mode
interaptove i,uopshte,kakva je razlika izmedju real-mode i
protected mode interaptova ? Kako se pristupa vishem wordu extended
registara (mislim na E+ax,bx itd.) ?
Ok,to bi bilo to :) pa ako nekog suvishe ne mrzi,10x svakome ko se
potrudi da odgovori na i jedno od ovih pitanja :)
Pozdrav..
asembler.471kojai,
>> Da li mozhe neko od iskusnijih programera da me uputi malo u
>> oblasti vezane za protected mode ,odnosno zashticeni rezhim.
Prelazi se sa dva reda programa... Inicijalizuje ga 20 redova(sto je
platforma)!
A ostalo je zajebano... Izuzetno! :(
asembler.472jjerry,
Kako da funkcijom 9 dosovog interapta ispishem neki string
nepoznate duzhine,koji se npr. zavrshavam nulom ,odnosno,kako da mu
"stavim" '$' na kraj ? :)
asembler.473jujo,
# Da li mozhe neko od iskusnijih programera da me uputi malo u
# oblasti vezane za protected mode ,odnosno zashticeni rezhim.
# Odnosno,konkretnije,kako procesor dolazi u stanje zashticenog
# rezhima ili to nije neophodno posebno raditi?
Evo ti jedan pmode extender. U stvari to je source koji se koristi sa
tvojom rutinom, a ima zadatak da prebaci masinu u protected mode, a
zatim poziva tvoj kod. Tvorci su Dardevil i Tran, koji su jos
poznati po 9kb pmode extenderu koji menja DOS4GW u Watcom programima.
U arhivi imas i par primera koji ilustruju kako se koristi ovo cudo.
A i sam sors koji prebacuje masinu u p-mode je DOBRO komentarisan.
-----
# Dalje,shta sve omogucava zashticeni rezhim u odnosu na obichan,tj.
# real mode ?
Pa najglavije je to da nemas vise ogranicenja od 64Kb po segmentu,
mapiranje memorije, virtuelna memorija....
# Da li je,i zashto potrebno vrshiti real-mode
# interaptove i,uopshte,kakva je razlika izmedju real-mode i
# protected mode interaptova ?
Real mode interapti koji npr. primaju neki registarski par (ES:BX)
kao pointer na neki bafer misle da se taj bafer nalazi u prvom
megabajto RAM-a. E kad pises programe u PMODE-u u 99% slucajeva
ti baferi se nalaze na adresama koje su preko 1Mb. Kad se zeznes
pa posaljes pointer na tu adresu u realmode int, masina se obesi.
Da bi se ovo izbeglo, koristi se DMPI poziv da se simulira REALMODE
interapt i onda je sve OK. Prilikom simulacije RM interapta, masina se
ZAISTA vraca u RM, ali samo na kratko.
Primeri ovih interapta su 10h, 13h, 21h...
Pmode interapti nemaju ovih problema.
# Kako se pristupa vishem wordu extended registara
# (mislim na E+ax,bx itd.) ?
Hmmm, nikako diraktno. Mozda sa siftovanjem ili sa nekom instrukcijom
koja swapuje sadrzaj 2Worda u jednom EXtended registru.
# Ok,to bi bilo to :) pa ako nekog suvishe ne mrzi,10x svakome ko se
# potrudi da odgovori na i jedno od ovih pitanja :)
Nije me mrzelo...
yooyo:
pmode251.zipasembler.474jjerry,
Shto se onih real interptova tiche,video sam jedan primer gde se
koristi funkcija 300h interapta 31h,navodno DPMI interapta,koja se
poziva sa brojem real int-a u ax-u. Mozhe tako ? :)
I btw. 10x za ovo :)
asembler.475jjerry,
Ok je ono..reshen problem..ispisujem znak po znak sve dok na ofsetu
[dx+n] ne nadjem nulu..
asembler.476stameni,
>> Ok je ono..reshen problem..ispisujem znak po znak sve dok na ofsetu
>> [dx+n] ne nadjem nulu..
Nije mi jasno zašto ti je string terminisan nulom? Možda
program u ASM-u povezuješ sa C-om?
Ako si u prilici da koristiš funkciju 9 interrupta 21h,
zašto to izbegavaš? Umesto 0 tamo je '$', kao što znaš...
Izvini na ovim pitanjima, trudim se da pomognem koliko mogu.
asembler.477jjerry,
Pa zato shto recimo kada pozovesh funkciju 4F00h interapta 10h
odnosno vracanje podataka o VESA rezhimu,u baferu koji se napuni na
ES:DI,na nekom ofsetu postoji i doubleword koji predstavlja far
pointer na OEM string (npr. "Matrox Mystique VBE/MGa" itd.) a taj
string kao i svi stringovi u tom baferu su terminisani nulom.
Inache,kao shto rekoh,uspeo sam to..
P.S Nisam bre valjda toliko blesav pa da se muchim kad vec mogu
lako :)
Pozdrav :)
asembler.478stameni,
>> Pa zato shto recimo kada pozovesh funkciju 4F00h interapta 10h
>> odnosno vracanje podataka o VESA rezhimu,u baferu koji se napuni na
>> ES:DI,na nekom ofsetu postoji i doubleword koji predstavlja far
>> pointer na OEM string (npr. "Matrox Mystique VBE/MGa" itd.) a taj
>> string kao i svi stringovi u tom baferu su terminisani nulom.
Mada si problem rešio petljom (ako se ne varam), evo sekvence
koja to radi (mada je opet petlja u pitanju, zbog prefiksa rep):
; mov ax, sgm
; mov es, ax
; mov di, ofs
mov cx, max_len
xor al, al
cld
repne scasb
jne not_found
dec di
mov al, '$'
mov [es:di], al
Ovo je spremno za štampanje preko 21h.
asembler.480pesnik,
Ima li neko dokumentaciju za CD-ROM kao device. Int, regs, itd.
Hvala.
pozdrav
asembler.481jujo,
# Ima li neko dokumentaciju za CD-ROM kao device. Int, regs, itd.
# Hvala.
#
# pozdrav
Imam dokumentaciju o mscdex-u, pa ako moze da koristi....
Ako negde naletis na dokumentaaciju u kojo je CD-u direktno
pristupa bio bih ti zahvalan...
yooyo:
mscdex.zipasembler.482pesnik,
>> Ako negde naletis na dokumentaaciju u kojo je CD-u direktno
>> pristupa bio bih ti zahvalan...
Svrljao sam po sinternetu, medjutim verovatno nisam dobro
trazio. Ako nesto nadjem, saljem.
pozdrav
asembler.483jjerry,
Potrebna mi je pomoc u vezi jedne funkcije koja obavlja isto shto i
shl/shr n (odnosno mnozi/deli sa 2^n) ali sa fixed point tipom.
Funkciju pokushavam da uradim uz pomoc FPU instrukcija.
Inache,kad hocu u okviru paskala da ispishem vrednost koju funkcija
vraca,stalno se ispisuje 'NAN'.Shta ovo NAN znachi ?
asembler.484jjerry,
Gluposti...Evo su funkcije koje za realan broj a i integer B
vracaju a*2^b ili a/2^b :
asm
fild b
fld a
fscale
fstp a
end;
,s tim shto bi funkcija za shiftovanje desno imala josh jedno
'fchs' izmedju 'fild b' i 'fld a'.
asembler.485obren,
> Inache,kad hocu u okviru paskala da ispishem vrednost koju funkcija
> vraca,stalno se ispisuje 'NAN'.Shta ovo NAN znachi ?
Vidim da si problem rešio, a NAN znači "Not A Number". Jednostavno,
kombinacija bitova ne predstavlja ni jedan smislen broj u pokretnom
zarezu.
asembler.486jjerry,
Aha...Da,to ima smisla. Btw. da li znash shta uophte rade
instrukcije fincstp/fdecstp. Po dokumentaciji,one
uvecavaju/smanjuju stack pointer za 1. Ali zashto su onda one
potrebne,jer chim se neshto baci na FPU stack,npr. ST(0),sledeca
vrednost ce ici automatski u ST(1),pa u ST(2) itd. ?
Pozdrav..
asembler.487stameni,
Sourcerom sam dobio program koji ne prolazi asembliranje.
Greška je u redu koji glasi:
PSP_cmd_tail+1 equ 82h
kao i u redovima koji zavise od ove promenljive.
Kako prevazići problem?
asembler.488jujo,
# Sourcerom sam dobio program koji ne prolazi asembliranje.
# Greska je u redu koji glasi:
# PSP_cmd_tail+1 equ 82h
# kao i u redovima koji zavise od ove promenljive.
# Kako prevazici problem?
PSP_cmd_tail+1 equ 82h
|
Pa nemoze + ovde....
yooyo:
asembler.489sabre,
(send assembler..... Ne postoji tema assembler.)
Imam sledeci problem... Nemam nikakve dokumentacije o grafickim karticama pa ne
znam kako da resim sledeci problem! Otvorio sam dva virtuelna ekrana u
memoriji i sada pokusavam da skrolujem... E sada kada u taj drugi ekran koji
se ne vidi pisem(crtam deo slike koji treba da se vidi) i kada hocu da ga
prikazem, tj da prikazem nastavak te slike, znaci drugi ekran, mnogo sporo mi
radi posto radi pomocu 10h interapta... Bukvalno mi za 320x200 secka... Sta
da radim, odnosno kako to da sredim da ne ide preko interapta...
Inace ako neko ima uputstva o bilo kakvim kartama neka salje, ali mi ne treba
ono primer: INT 10h AH=204h nego celokupna dokumentacija o kartici!
Btw. Svaka cast DirectX-u! :)
asembler.490stameni,
>> # Sourcerom sam dobio program koji ne prolazi asembliranje.
>> PSP_cmd_tail+1 equ 82h
>> |
>> Pa nemoze + ovde....
Znam. Ipak mi je Sourcer (ne onaj kačen ovde) to napravio, pa
me to malo čudi :(
asembler.491stameni,
>> E sada kada u taj drugi ekran
>> koji se ne vidi pisem(crtam deo slike koji treba da se vidi) i kada hocu
>> da ga prikazem, tj da prikazem nastavak te slike, znaci drugi ekran,
>> mnogo sporo mi radi posto radi pomocu 10h interapta... Bukvalno mi za
>> 320x200 secka... Sta da radim, odnosno kako to da sredim da ne ide preko
>> interapta...
Prvo moraš da napišeš brzu rutinu za crtanje tačke, gađanjem
video memorije (bez BIOS-a, jer je tako, kao što si i sam video,
sporo). Za mod 13h i rezoluciju 320x200x256 video memorija počinje
na A000h. Svakom pikselu odgovara jedan bajt. Prvi bajt (na
ofsetu 0000h) je (mislim) u levom gornjem uglu ekrana, drugi bajt
ispod njega, treći ispod i tako sve do 200.
Zatim moraš da smisliš brz način za prebacivanje slike u video
RAM (tj. na ofset A000h). Mislim da je to najbrže preko DMA (nisam
najsigurniji; ovde će se već naći neko ko zna). Ako ti se ne
programira DMA, pogledaj naredbe MOVSB/MOVSW/MOVSD i REP prefiks.
Probaj da premestiš samo one delove slike koji su promenjeni,
mislim da stvar može da se ubrza.
Dokumentacija su VGADOC (ima ovde) i spisak instrukcija
procesora, kao i razni helpovi.
asembler.492sabre,
>> Prvo moras da napises brzu rutinu za crtanje tacke, gadanjem
>> video memorije (bez BIOS-a, jer je tako, kao sto si i sam video,
>> sporo). Za mod 13h i rezoluciju 320x200x256 video memorija pocinje
>> na A000h. Svakom pikselu odgovara jedan bajt. Prvi bajt (na
>> ofsetu 0000h) je (mislim) u levom gornjem uglu ekrana, drugi bajt
>> ispod njega, treci ispod i tako sve do 200.
Da da znam ja to vrlo dobro i to ne radim preko 10h interapta... Ja ne
upisujem na poziciju A000h(posto ne radim u 320x200) vec upisem u neki deo
memorije i onda ga ispageujem i iscrtam... To nije problem. Mogu da
prikazujem 800x600x256 brzinom 20+ ekrana, to nije problem... Ali zanima me
kako kartici da kazem da hocu da mi drugi virtualni ekran lepi preko
postojeceg! Necu da radim stalno iscrtavanje zato sto dolazi do blinkanja, a
"prelepljivanje" radi izuzetno tecno... To sam video pod DirectX-om kolika je
razlika kad se icrtava(mada je tamo 1024x768 oko 70 frejmova :)) i uspori i
kada se skroluje...
asembler.493jujo,
# Da da znam ja to vrlo dobro i to ne radim preko 10h interapta... Ja ne
# upisujem na poziciju A000h(posto ne radim u 320x200) vec upisem u neki
# deo memorije i onda ga ispageujem i iscrtam... To nije problem. Mogu da
# prikazujem 800x600x256 brzinom 20+ ekrana, to nije problem... Ali zanima
# me kako kartici da kazem da hocu da mi drugi virtualni ekran lepi preko
# postojeceg! Necu da radim stalno iscrtavanje zato sto dolazi do
# blinkanja, a "prelepljivanje" radi izuzetno tecno... To sam video pod
# DirectX-om kolika je razlika kad se icrtava(mada je tamo 1024x768 oko 70
# frejmova :)) i uspori i kada se skroluje...
U standardnom VGA modu nemoze nikako. Mod 10h "vidi" samo prvih 64kb
memorije video kartice. Mode X vec moze.
Sto se VESE tice, postoje lepo dokumentovane pozive BIOS-a kako da
swichujesh ekrane. Za to ti treba kao prvo VESA2 BIOS, a ekrane
swichujesh pomeranjem adrese pocetka video memorije. To zaista
brzo radi ali ima jedan problem. Ta memorija se nalazi na kartici
i procesor nije u stanju da je keshira, tako da je direktno crtanje
po video memoriji sporije od crtanja po ostatku memorije.
yooyo:
asembler.494stameni,
Tek sad videh da si tražio DirectX - o tome znam jako malo jer
nisam u prilici da se time detaljnije pozabavim :( Izvinjotina na
pokušaju.
asembler.495sabre,
>> Sto se VESE tice, postoje lepo dokumentovane pozive BIOS-a kako da
>> swichujesh ekrane. Za to ti treba kao prvo VESA2 BIOS, a ekrane
>> swichujesh pomeranjem adrese pocetka video memorije. To zaista
>> brzo radi ali ima jedan problem. Ta memorija se nalazi na kartici
>> i procesor nije u stanju da je keshira, tako da je direktno crtanje
>> po video memoriji sporije od crtanja po ostatku memorije.
Ha... Sta da ti kazem daj mi dokumentaciju! :)
asembler.496jujo,
# Ha... Sta da ti kazem daj mi dokumentaciju! :)
Ha... pa nadji negde VGADOC4b.zip. Ostavio sam ga u nekoj konfi...
yooyo:
asembler.497stameni,
Koje dokumente o programiranju u zaštićenom modu
preporučujete? Ima li toga na Sezamu? Možda ima na nekoj ftp
adresi?
Heeeelp!
asembler.498sqweaky,
Da li 386+ procesori mogu da pristupe 32-bitnim registrima (npr. EAX)
kada su u realnom režimu ili moraju da pređe u protected mod? Takođe,
da li mogu da koristim instrukcije koje operišu sa 32-bitnim podacima
(lodsd, stods) u realnom modu?
Miloš
asembler.499jjerry,
>>Da li 386+ procesori mogu da pristupe 32-bitnim registrima (npr.
>>EAX) kada su u realnom rezimu ili moraju da prede u protected mod?
>>Takode, da li mogu da koristim instrukcije koje operisu sa
>>32-bitnim podacima (lodsd, stods) u realnom modu?
Naravno da mogu,sve shto ti treba je .386/P386N stavka ili
(neobavezno) USE32 posle deklaracije segmenta i IDEAL modu.
Pa ti mozhesh da napravish prog. u obichnom TASM-u,bez extendera ,
dakle u RM,chisto testa radi,koji koristi E(AX,BX...).
asembler.500jjerry,
Potrebna mi je brza SQRT funkcija radjena u asembleru,ne narochito
hitno.Samo da ima shto manje mul/div operacija,a preciznost od 4
decimale je sasvim dovoljna...Inache,kao parametre prima fixed
point brojeve (32 bita,gornjih 16 integer,donjih 16 fraction).
Pozdrav..
asembler.501stameni,
>> Potrebna mi je brza SQRT funkcija radjena u asembleru,
Izbistri koprocesorsku funkciju FSQRT.
asembler.502jjerry,
Znam ja koprocesorske funkcije od ranije ,i ova ima i pristojan
broj ciklusa,za sqrt rutinu,od 70 do neshto preko 100,koliko se
secam; ali sam mislio da l' mozhe neshto da se uradi bez
koprocesora...Inache,u shkoli sam uchio kao jednu od mogucnosti
tzv. Njutnovu iterativnu metodu,ali ona u svakom ciklusu ima bar
jedan realni DIV...
P.S Ustvari i nema preterane potrebe za brzinom,poshto sam hteo to
da ubacim u rutinu za normalizaciju normal-vektora,vishe me je
zaintrigiralo ovako...
asembler.503ventura,
Jel ima neko programce (ili moze da napravi) koje bi promenilo
seriski broj hard diska u MBR-u?
-Na kojoj se adresi nalazi seriski broj hard diska?
asembler.504jjerry,
Kako se u asembleru adresiraju matrice,tj. 2D nizovi ? Mozhda bi
neko mogao da mi poshalje primer korishcenja matrica u asembleru..
asembler.505stameni,
Našao sam nekoliko rutina za računanje kvadratnog korena
među onim snippetsima za asembler. Ako ti je još to potrebno,
reci da ti šaljem na mail, jer mislim da nije baš u redu slati
deo arhive u conf.
asembler.506jjerry,
>> Nasao sam nekoliko rutina za racunanje kvadratnog korena
>>medu onim snippetsima za asembler. Ako ti je jos to potrebno,
Naravno,sve dok operishu sa fixed-point brojevim (16 bit integer,16
bit fraction)...
10X a bundle..
J.J
asembler.507dzakic,
> Kako se u asembleru adresiraju matrice,tj. 2D nizovi ? Mozhda bi neko
> mogao da mi poshalje primer korishcenja matrica u asembleru..
Struktura 'matrica' ne postoji u asembleru. Ukoliko znaš da radiš sa
običnim 1D-nizovima, onda napravi niz dužine 0..MAXX*MAXY-1, i pristupaj
elementu sa Element[i,j]:=Niz[i*MAXX+j], gde je i iz intervala [0..MAXY-1],
a j [0..MAXX-1]. Za ovo je potrebno malo snalaženja sa registrima da se
izračuna offset elementa unutar niza (ADD i MUL), ali je izvodljivo.
asembler.508stameni,
>> Struktura 'matrica' ne postoji u asembleru. Ukoliko znaš da radiš sa
>> običnim 1D-nizovima, onda napravi niz dužine 0..MAXX*MAXY-1, i
>> pristupaj elementu sa Element[i,j]:=Niz[i*MAXX+j], gde je i iz intervala
>> [0..MAXY-1], a j [0..MAXX-1].
U stvari, formula je Element[i, j] := Niz[i, j * MAXX].
Petljavina sa registrima ide otprilike ovako:
----<cut>----
max_x equ 4 ; matrica je [0..max_x-1, 0..max_y-1]
x equ 2 ; element je na [x, y]
y equ 3
mov al, y ; al := y
mov bh, max_x ; u bh ide maksimalna vrednost za x
mul bh ; ax := al * bh
add ax, x ; ax := ax + x
mov bx, offset matrica
add bx, ax ; ovde bx pokazuje na bajt u matrici
; na koordinatama (x, y)
mov ah, [bx] ; i to se ovde čita
matrica: db ...
----<cut>----
asembler.509dzakic,
> U stvari, formula je Element[i, j] := Niz[i, j * MAXX].
Tebi se očigledno više sviđa Fortran-stil skladištenja matrice. Naravno,
potpuno je svejedno kako matricu čuvamo u memoriji dokle god program sa
njom ispravno radi.
asembler.510stameni,
>> > U stvari, formula je Element[i, j] := Niz[i, j * MAXX].
>> ^
>> Tebi se očigledno više sviđa Fortran-stil skladištenja matrice.
Zapravo, pogrešio sam u kucanju. Naime, na označenom mestu
umesto ',' treba da stoji '+'.
Međutim, kad bolje razmislim, vidim da sam te pogrešno
kritikovao; ti tvrdiš Niz[i * MAXX + j], a ja, uz ovu ispravku,
Niz[i + j * MAXX]. Svejedno je, s tim što je moja ideja imala
sintaksnu grešku ;)
Ipak, onaj kod koji sam poslao -- radi.
asembler.511stameni,
Kako detektovati da li je računar u turbo režimu ili ne?
Kako uključiti, a kako isključiti turbo?
asembler.512jjerry,
Necu ti bash odgovoriti na pitanje ,al' 'ajde..
Lm,noviji kompjuteri su automatski u tzv. turbo rezhimu,tako
da,tehnichki,ne postoji turbo i obichan rezhim. Ako taj princip
nije do sada kod svih proizvodjacha napushten,sigurno ce se
napustiti vrlo brzo,pa se postavlja pitanje ima li svrhe raditi
bilo shta sa tim.
Pozdrav..
asembler.513milosavljevic,
Hi!
Treba mi Turbo Assembler.
Goran.
asembler.514pesnik,
Ljudi,
jel ima neko MS MASM compiler arhivu?
Bio bi zahvalan ako bi to neko odnekud iscupao.
pozdrav,
pesnik
asembler.516vule.,
Kako da postavim text mod od 50 linija ili malo nizi ?
asembler.517vasic,
> Kako da postavim text mod od 50 linija ili malo nizi ?
To radiš tako što učitaš font odgovarajuće visine. Znači, pošto u
standardnom tekst modu imaš 400 tačaka po vertikali, učitaš font visine
10 i dobićeš 40 redova na ekranu. Uz poruku kačim moj programčić koji
radi takve stvari. Pisan je u C-u ali ono što tebe interesuje nalazi se
u jednom asm bloku na kraju tako da ipak ne ispada iz okvira teme. :)
lf.casembler.518sjocic,
Ima li neko source kod (asm) nekog digitrona (za Dos) i
readme.com (view, list) fajla (isto u asm-u) ?
asembler.519evol,
Jedno debilno pitanje...
Preuzeo sam COM4 tj. nisam ga preuzeo posto ne mogu da popunim one tablice
kod portova... Ako je neko radio neka mi posalje da se ne maltretiram, posto
je COM4 poznat po tome sto zajebava oko odziva, tj. mora da se lepo popuni
tablica(tablice) da bi kada se nakacim korektno vracao svaku promenu...
Isa
asembler.520stameni,
Evo jedne prastare glavolomke, koju duze vreme pokusavam da
resim, bez uspeha. Sada je u pitanju problem, koji pokusava da
resi drugar u okviru domaceg zadatka.
Dakle: kako u asembleru nacrtati tacku u 640 x 480 x 16?
Sva magija koju smo drugar i ja koristili nije pomogla. :(
F1, please!
asembler.521emajsijuen,
>> Dakle: kako u asembleru nacrtati tacku u 640 x 480 x 16?
Evo ide neka putpixel rutina pisana u assembleru (u okviru pascala). Imam
negde na disku jos jednu (koja je valjda nesto brza od ove), pa cu ti poslati
cim stignem...
Pozdrav, Vlada...
asmgraph.pasasembler.522stameni,
Drugara interesuje algoritam (ili potprogram) za deljenje
dva racionalna broja, bez koprocesora ili "naprednijih"
instrukcija -- program treba da se izvršava i na 8086. Pošto
znam da ima još onih sa ETF-a koje to zanima ;), ne bi bilo
loše da ako neko ima to (deljenje) rešeno, baci isto ovde, na
radost i sreću ;) svih kojima to treba :)
Možda ima u Knuthovim knjigama algoritam (ne znam, nemam
to), pa ako neko može da pogleda i prepiše odatle -- bilo bi
fino...
asembler.523jjerry,
>> Drugara interesuje algoritam (ili potprogram) za deljenje
>>dva racionalna broja, bez koprocesora ili "naprednijih"
A u kom obliku su predstavljeni racionalni brojevi - kao brojilac i
imenilac ili kao ceo i decimalni deo ?
asembler.524stameni,
>> A u kom obliku su predstavljeni racionalni brojevi - kao brojilac i
>> imenilac ili kao ceo i decimalni deo ?
I deljenik i delilac se sastoje iz celog i decimalnog dela.
asembler.525sjocic,
├> Drugara interesuje algoritam (ili potprogram) za deljenje
├> dva racionalna broja, bez koprocesora ili "naprednijih"
├> instrukcija -- program treba da se izvršava i na 8086. Pošto
├> znam da ima još onih sa ETF-a koje to zanima ;), ne bi bilo
├> loše da ako neko ima to (deljenje) rešeno, baci isto ovde, na
├> radost i sreću ;) svih kojima to treba :)
Ajte ljudi, pomozite čoveku ! :)
asembler.526burazer,
Da li neko ima assembler to c translator iliti converter?
asembler.527ventura,
> Da li neko ima assembler to c translator iliti converter?
Uff... bojim se da to ne postoji.. ima opcija da pri kompajliranju
C sorsa, stavis Generate ASM Source, ali neverujem da ima nesto
obratno...
asembler.528nbjvsb,
>> Da li neko ima assembler to c translator iliti converter?
Rekao bih da je to čudo nemoguće napraviti. Prosto, svaki C kompajler
pravi drugačiji mašinski, pa samim tim i potencijalni .asm kod. Još
nešto - gomila C funkcija urađena je upravo u asembleru, a čisto sumnjam
da bi prevodioc za takvu gomilu linija umeo da daje imena funkcija (npr.
printf("blabla") ). Da ne pominjem sve one silne jumpove...
Mogućnost prevođenja asm koda u bilo koji viši programski jezik ravna je
mogućnosti pravljenja programa koji će iz WAV/MP3 fajla izvući note :-)
asembler.529burazer,
Cudo jedno da na internetu postoji tako neesto i zove se
assembler to c translator
samo sto ja nisam u mogucnosti da dam $870 za isti.
Na primeru koji je dat uz oglas, lepo se vidi da konvertuje assemler
u C i to radi brzinom 400-500 linija u sekundi.
asembler.530ventura,
> Cudo jedno da na internetu postoji tako neesto i zove se
> assembler to c translator
> samo sto ja nisam u mogucnosti da dam $870 za isti.
> Na primeru koji je dat uz oglas, lepo se vidi da konvertuje assemler
> u C i to radi brzinom 400-500 linija u sekundi.
Cool... a na sta taj source posle lici... izgleda na nesto poput
ovoga...
.
.
.
main()
{
asm{
pop ax;
pop ds
.
.
.
}
.
.
.
}
Ilito nesto jos zajebanije...
*str = "0D6E14";
strcpu(ffe34, 14E5);
dobro bi bilo da nam bacis ovde primer prevedenog sourca.. pa da vidimo..
asembler.531jjerry,
>>Cudo jedno da na internetu postoji tako neesto i zove se
>>
>>assembler to c translator
Sudetji po ovome shto je ventura napisao nije nikakvo chudo..
A drugo,zashto bi ikome bilo potrebno da prevodi sa asemblera na C ?
C programer ne bi trebalo da ne zna ASM i obratno,pa se onda
postavlja pitanje zashto prevoditi kad se podjednako dobro
snalazish u oba jezika ? Daj mi pragmu i ASM sors i retji tju ti za
shta procedura sluzhi..bez translatora i sranja..
Poz,J.J..
asembler.532wlaad,
jel' ima josh neko onu zbirchicu 4K demoa sa nekog assemblyja (94 il 95)?
znam da je neko slao u neku grupu, al' se ne setjam ni ko je slao,
ni koja je grupa, so..
10x.
asembler.533ventura,
> jel' ima josh neko onu zbirchicu 4K demoa sa nekog assemblyja (94 il 95)?
>
> znam da je neko slao u neku grupu, al' se ne setjam ni ko je slao,
> ni koja je grupa, so..
Imam ja sve vaznije demoe, pre '97 samo reci ime, i poslacu ti ga...
asembler.534ventura,
Pisem neki TSR, pa mi treba neko ko stvarno zna ASM...
mail...
asembler.536jjerry,
Kako se konvertuje real-mode pointer u protected mode pointer ?
Poz,JJ..
asembler.537silence,
Ako nekom nekad padne na pamet da krene da uči asembler, ili već nešto
piše, onako početnički (možda i ne samo početnički), a usfali mu kakva
informacija ili hint, evo adrese sa univerzitetskim kursem asemblera
prof. Randall Hyde-a:
http://webster.cs.ucr.edu/
To je adresa osnovne stranice, dalje će te se lako snaći. Sem asemblera,
na istoj adresi može se naći i Pattern Matching rutine (kao i sama
teorija) za Delphi, linkovi za C/C++ tutorijale, itd.
Na istom serveru, na stranici 'Recources On The Net':
http://webster.cs.ucr.edu/pro_lang/inet_links/proglang.htm
dat je obiman pregled linkova (tutorijali, FAQ-ovi, itd) za sve (?)
programske jezike. Možda je neki jezik i izostavljen - proverite sami.
Ja ih izbrojah tamo ravno 45 (komada)!!! Da, prisutni su i Dylan, i
Python, i Eiffel... :)
asembler.538milko,
Pomenuti je i autor knjige 'Art of assembly language programming'.
Koju preporucujem svakom asm koderu. Imam je u el. formatu i teska
je oko 10mb. Pa ako neko otje, nek me mailne da se dogovorimo oko
prenosa. Btw, obavezno otitji na www.x86.org .
asembler.539silence,
> Pomenuti je i autor knjige 'Art of assembly language programming'.
Rekao bih da se upravo ta knjiga nalazi na adresi koju sam dao u
prethodnoj poruci. Hvala za www.x86.org!
asembler.540milko,
Upravo odatle sam je i dl. Ima li neko UCR Standard Library, ciji
je autor, autor knjige 'Art of asm'? Pomenuti lib ide uz knjigu u
papirnatoj formi koliko znam, a ima da se dl na intu.
asembler.541milko,
Obavezno pratiti news grupu comp.lang.asm.x86 . Btw, na
www.wotsit.org ima takodje gomila korisnog materijala.
asembler.542milko,
NetWide Assembler 0.97 iliti nasm0.97! Dl obavezan
asembler.543milko,
nestade struje.:( ponovo...
nasm097.zipasembler.544roach,
Evo knjige Art Of Assembly Language Progging, by Hyde Randall.
Milosh.Zorica
artofasm.zipasembler.545stameni,
P2 Processor Developer's Manual (.PDF)
#1/2
p2devman.arjasembler.546stameni,
P2 Processor Developer's Manual (.PDF)
#2/2
p2devman.a01asembler.547stameni,
Intel Architecture Optimization Manual (.PDF)
#1/1
optim.arjasembler.549stameni,
System Programming Guide (.PDF)
#1/2
sysprog.arjasembler.550stameni,
System Programming Guide (.PDF)
#2/2
sysprog.a01asembler.551stameni,
Instruction Set Reference (.PDF)
#1/2
isr_v2.arjasembler.552stameni,
Instruction Set Reference (.PDF)
#2/2
isr_v2.a01asembler.553silence,
> Upravo odatle sam je i dl. Ima li neko UCR Standard Library, ciji
> je autor, autor knjige 'Art of asm'? Pomenuti lib ide uz knjigu u
> papirnatoj formi koliko znam, a ima da se dl na intu.
Na Internetu je na:
ftp.cs.ucr.edu
u direktorijumu:
/pub/pc/ibmpcdir
Evo ostatka teksta iz fwd.html-a koji govori o načinu logovanja i
fajlovima koji su potrebni.
Log onto ftp.cs.ucr.edu using the anonymous account name and any
password. Switch to the "/pub/pc/ibmpcdir" subdirectory (this is UNIX
so make sure you use lowercase letters). You will find the appropriate
files by searching through this directory.
The exact filename(s) of this material may change with time, and
different services use different names for these files. Generally
posting a message enquiring about the UCR Standard Library or this text
will generate appropriate responses.