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,
-> #210, bilder> 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,
-> #211, bilder> ..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,
-> #215, mdimitrijevic; 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,
-> #216, jexy
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,
-> #216, jexy 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,
-> #217, mdimitrijevic; 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,
-> #219, jexy> 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,
-> #222, stameni>> 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,
-> #222, stameni> 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,
-> #223, space.ace>> 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,
-> #226, dzakic>> 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,
-> #227, stameniNije 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,
-> #228, space.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!
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,
-> #229, space.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.
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,
-> #231, stameni)-> 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,
-> #233, jexy> 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,
-> #234, mdimitrijevic; 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,
-> #235, jexy> 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,
-> #237, ognjen
> 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,
-> #237, ognjen> 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,
-> #239, mdimitrijevic)-> 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,
-> #240, ognjen
> 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,
-> #243, biber
> 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,
-> #242, stameni> 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,
-> #248, bokir> 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,
-> #244, stameni> Kako poslati komandu fossilu X00 iz assemblera?
Korišćenjem odgovarajućeg poziva (videti specifikaciju koja dolazi
uz sam X00)
asembler.251bokir,
-> #249, mdimitrijevic> 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,
-> #245, janko>> 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,
-> #252, biber
> 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,
-> #251, bokir
> 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,
-> #251, bokir> 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,
-> #259, bilder> 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,
-> #247, pedjak>> > 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,
-> #262, stameni> 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,
-> #262, stameni> 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,
-> #265, jexy> 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,
-> #268, stameni>> ; 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,
-> #270, stameni> 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,
-> #272, obren>> 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,
-> #273, stameni> 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,
-> #274, obren>> > 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,
-> #275, stameni> 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,
-> #276, obren>> 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,
-> #277, nethsah>> 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,
-> #274, obren> 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,
-> #281, mdimitrijevic>> 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,
-> #279, stameni;; >> 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,
-> #282, stameni;; 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,
-> #282, stameni> 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,
-> #285, mdimitrijevic>> > 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,
-> #286, stameni> 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,
-> #287, mdimitrijevic>> 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,
-> #288, stameni 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,
-> #289, mdimitrijevic>> 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,
-> #290, stameni>>> 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,
-> #292, lepiaf> 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,
-> #295, jjerry
>> 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,
-> #296, stameniPrvo 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,
-> #295, jjerry> 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,
-> #299, biber;;
;; 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,
-> #301, sasabNisam 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,
-> #305, magn>> 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,
-> #303, jjerry> 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,
-> #308, jexyImam 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,
-> #309, qpele;; Je si li probao sa F7 ?
Da i nema nikakve razlike.. i dalje se zaglupi..