PCPROG.6

25 Sep 1995 - 24 Dec 1999

Topics

  1. algoritmi (449)
  2. baze.podataka (309)
  3. ms.dos (17)
  4. windows (294)
  5. asembler (553)
  6. basic (458)
  7. jezici (42)
  8. pascal (1297)
  9. cccc (522)
  10. cpp (299)
  11. clipper (601)
  12. fox (70)
  13. cavo (14)
  14. delphi (1130)
  15. java (100)
  16. razno (776)
  17. unknown (127)

Messages - asembler

asembler.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 ?!?
asembler.211 bilder,
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.212 sasab,
Ima li neko disasembliranu rutinu za int17h iz nekog 286 BIOS-a? Bogi
asembler.213 mdimitrijevic, -> #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.214 mdimitrijevic, -> #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.215 mdimitrijevic,
PMODE v1.24, najnovija verzija Tran-ovog Protected Mode Extendera. pmw124.zip
asembler.216 jexy, -> #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.zip
asembler.217 mdimitrijevic, -> #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.218 mdimitrijevic, -> #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.219 jexy, -> #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.220 stameni,
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.221 mdimitrijevic, -> #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.222 stameni,
Kako poslati modemu na COM3 ili COM4 komandu ATD ? Ne treba mi ni jedna druga.
asembler.223 space.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.224 obren,
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.zip
asembler.225 obren,
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.doc
asembler.226 dzakic, -> #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.227 stameni, -> #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.228 space.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.229 space.ace, -> #227, stameni
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.230 stameni, -> #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.231 stameni, -> #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.232 ognjen, -> #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.233 jexy,
Ima li ovde neko PMODE/W v1.22 od Tran-a !?!
asembler.234 mdimitrijevic, -> #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.235 jexy, -> #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.236 mdimitrijevic, -> #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.zip
asembler.237 ognjen,
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.238 janko, -> #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.239 mdimitrijevic, -> #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.240 ognjen, -> #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.241 janko, -> #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.242 stameni,
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.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?
asembler.244 stameni,
Kako poslati komandu fossilu X00 iz assemblera?
asembler.245 janko, -> #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.246 bokir,
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.247 pedjak, -> #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.248 bokir,
Zašto mov es:ŠbxĆ, al izaziva exception, i kako to da izbegnem? ( Ono Š i Ć su uglaste zagrade ;)
asembler.249 mdimitrijevic, -> #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.250 pedjak, -> #244, stameni
> Kako poslati komandu fossilu X00 iz assemblera? Korišćenjem odgovarajućeg poziva (videti specifikaciju koja dolazi uz sam X00)
asembler.251 bokir, -> #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.zip
asembler.252 biber, -> #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.253 janko, -> #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.254 janko, -> #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.255 mdimitrijevic, -> #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.256 micke,
***************************************************************************** Potreban mi je ASEMBLER za procesor 80086 pa ako neko ima neka mi baci u mail (micke). *****************************************************************************
asembler.257 biber,
Ima li ko 32-binu verziju Soft-Ice (za windows)? Je li to jos uvek shareware program?
asembler.258 bilder,
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.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 !
asembler.260 mdimitrijevic, -> #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.261 stameni, -> #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.262 stameni,
Nije mi jasna razlika između MOVS i MOVSB, pa ako neko zna... Bye :)
asembler.263 bokir, -> #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.264 banga, -> #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.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 )
asembler.266 nenad, -> #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.267 jexy,
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.268 stameni,
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.269 stameni, -> #268, stameni
>> ; Blankovanje ekrana preko tastera PrtSc Evo prevedene verzije... blank.com
asembler.270 stameni,
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.272 obren, -> #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.273 stameni, -> #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.274 obren, -> #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.275 stameni, -> #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.276 obren, -> #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.277 nethsah,
treba mi neki dobar assembler...
asembler.278 stameni, -> #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.279 stameni, -> #277, nethsah
>> treba mi neki dobar assembler... Probaj a86, dobar je i košta džabe ;) te ga ima i u dir-u.
asembler.280 nethsah,
haval za savet...
asembler.281 mdimitrijevic, -> #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.282 stameni, -> #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.283 jexy, -> #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.284 jexy, -> #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.285 mdimitrijevic, -> #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.286 stameni, -> #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.asm
asembler.287 mdimitrijevic, -> #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.288 stameni, -> #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.asm
asembler.289 mdimitrijevic, -> #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.asm
asembler.290 stameni, -> #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.291 mdimitrijevic, -> #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.292 lepiaf,
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.293 bokir, -> #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.294 bokir,
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.295 jjerry,
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.296 stameni, -> #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.asm
asembler.297 jjerry, -> #296, stameni
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.298 biber, -> #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.299 biber,
Ima li neko dokumentaciju za programiranje SVGA kartica kompatabilnih sa VESA standardom? Konkretno, treba mi 320x200 u hi i true color modovima.
asembler.300 jexy, -> #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.zip
asembler.301 sasab,
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.302 tomcat,
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.303 jjerry, -> #301, sasab
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.304 tomcat,
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.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.
asembler.306 stameni, -> #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.307 sasab, -> #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.308 jexy,
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.309 qpele, -> #308, jexy
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.310 jexy, -> #309, qpele
;; Je si li probao sa F7 ? Da i nema nikakve razlike.. i dalje se zaglupi..