Opettelen Assemblyä MBnetin ASMQRSSIn avulla. Kolmannessa osassa opetetaan tekemään ohjelma, joka laittaa caps-lockin, jne päälle / pois. Oppaan mukaan tavu, jossa on bitit niille näppäimille + shiftit jne. sijaitsee muistiosoitteessa 0040h:0017h
Bitti | Toiminta -------+-------------------------------- 7 | Insert-tila 6 | Caps Lock -tila 5 | Num Lock -tila 4 | Scroll Lock -tila 3 | Alt-näppäimen tila 2 | Ctrl-näppäimen tila 1 | Vasemman Shift-näppäimen tila 0 | Oikean Shift-näppäimen tila
Tein koodin (NASM)
org 100h mov ax, 0040h ; Ei dx:ään voi suoraan siirtää arvoa, joten näin. mov dx, ax ; Lopulliseksi muistiosoitteeksi tulee 0040h:0017h mov al, [0017h] and al, 9fh ; Muutetaan muistiosoitteen 0040h:0017h bittejä. mov [0017h], al ; Ja siiretään muutetut ko. osoitteeseen. mov ah, 4ch ; Ja sitten keskeytys, joka lopettaa ohjelman. int 21h end
mutta tuo ei tee mitään. jos laitan tuon and-lausekkeen
and al, 9fh muotoon al, 01100000b, prossu pyöri täysillä eikä tee mitään. Noin ollessa ohjelma taas sammuu heti, eikä tee mitään. Itse en vikaa hoksaa, eikä assembleri sano mitään. Käännetty
nasm -g lukko.asm -o lukko.com
eikös sun pidä kutsua tuota 4ch keskeytystä int 4ch
Ei :)
Pitää siirtää tuohon rekisteriin ah tuo arvo, ja int 21h tietääkseni lukee sitten sieltä tuon keskeytyksen. int 21h on keskeytys, 4Ch on sen funktio (ainakin niin minulle sanottiin :))
Kopioi segmentin osoite rekisteriin DS (ei siis DX), niin pitäisi toimia.
Ei toimi.
Nyt koodi olisi
org 100h mov ax, 0040h ; Ei dx:ään voi suoraan siirtää arvoa, joten näin. mov ds, ax ; Lopulliseksi muistiosoitteeksi tulee 0040h:0017h mov al, [0017h] and al, 9fh ; Muutetaan muistiosoitteen 0040h:0017h bittejä. mov [0017h], al ; Ja siiretään muutetut ko. osoitteeseen. mov ah, 4ch ; Ja sitten keskeytys, joka lopettaa ohjelman. int 21h end
Windowsissa ohjelma tuskin toimii, mutta DOSissa juuri tuo koodi toimii.
Onko tietoa, miksei windowsissa toimi?
Ja saisiko sen wintoosassa toimimaan?
Ei toiminut komentorivinkään kautta, ja tuskin (en ainakaan tiedä miten) pääsen juuri sitä lähemmäksi dossia :)
Vai olenko väärässä?
Miksi et voi asentaa DOSBox:ia?
Muistaakseni INT 21h on DOS-keskeytys.
Kyllä int 21h toimii minulla windowsillakin.
Ei se suoraan windowsissa toimi, vaan siinä command.comissa/cmd:ssä tjsp.
Siis... Tein (samasta kurssista edelliseen ja sitä edelliseen tehtävään) ensin tuontapaisen asm ohjelman, ja käytin sitä batch-filussa lukemaan painetun näppäimen. Siinä oli noita int 21h:ta jne.
Mutta takaisin aiheeseen.
Eli tuollainen ei windowsissa toimi?
Mutta pystyykö sitä sellaiseksi tekemään, että toimisi?
Tässä nyt tähän aiheeseen vähän sopimaton, mutta enpä uuttakaan tämän takia viitsinyt aloittaa, eli tietääkö joku jotain hyvää listaa (mieluiten suomeksi, mutta englanniksikin ok) assemblyn keskeytyksistä, jne?
Hyvä tietolähde on HelpPC, jossa on paljon tietoa mm. keskeytyksistä (interrupts).
Kiitos. Tuota täytyykin tutkia.. :)
http://www.ctyme.com/rbrown.htm
Tuo on aika klassinen referenssi, josta löytyy vastaus moneen pulmaan.
pukki kirjoitti:
http://www.ctyme.com/rbrown.htm
Tuo on aika klassinen referenssi, josta löytyy vastaus moneen pulmaan.
Ainakin hyvä keskeytysluettelo tuolla on.
Syy tuon toimimattomuuteen on mitä luultavimmin yksinkertaisesti se, että niin reikäinen kuin Windows kuuluu olevankin, niin silti siinä ei voi noin vain lukea ja kirjoittaa muistia, jos ohjelmalla ei ole kyseiseen muistialueeseen oikeutta.
Metabolix kirjoitti:
Syy tuon toimimattomuuteen on mitä luultavimmin yksinkertaisesti se, että niin reikäinen kuin Windows kuuluu olevankin, niin silti siinä ei voi noin vain lukea ja kirjoittaa muistia, jos ohjelmalla ei ole kyseiseen muistialueeseen oikeutta.
En usko muistialueiden oikeuksien tässä tapauksessa olevan ongelmana. Tuon ohjelman Windows ajanee V86-moodissa ja varanee sille joka tapauksessa sen 1MB+64KB alueen.
Kenttu kirjoitti:
Mutta pystyykö sitä sellaiseksi tekemään, että toimisi?
Kyllä.. Ohjelma tulee kirjoittaa Windowsille dos:n sijasta. Tähän sopiva esimerkki löytyy Mureakuhan koodikirjastosta (joskin masm32:lle): http://mureakuha.com/koodikirjasto/388
Vaikkei esimerkki vielä caps lock:n käyttöä esittele, antaa se suuntaa siitä miten Windowsille ohjelman tekeminen onnistuisi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.