Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Ongelmia Assemblyssä

Sivun loppuun

Kentti [01.01.2007 14:14:39]

#

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

tesmu [01.01.2007 14:51:56]

#

eikös sun pidä kutsua tuota 4ch keskeytystä int 4ch

Kentti [01.01.2007 14:55:00]

#

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 :))

Antti Laaksonen [01.01.2007 14:58:41]

#

Kopioi segmentin osoite rekisteriin DS (ei siis DX), niin pitäisi toimia.

Kentti [01.01.2007 15:13:56]

#

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

Antti Laaksonen [01.01.2007 15:34:19]

#

Windowsissa ohjelma tuskin toimii, mutta DOSissa juuri tuo koodi toimii.

Kentti [01.01.2007 17:02:40]

#

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ä?

peran [01.01.2007 17:37:05]

#

Miksi et voi asentaa DOSBox:ia?

Muistaakseni INT 21h on DOS-keskeytys.

Kentti [01.01.2007 18:00:24]

#

Kyllä int 21h toimii minulla windowsillakin.

rndprogy [01.01.2007 18:24:25]

#

Ei se suoraan windowsissa toimi, vaan siinä command.comissa/cmd:ssä tjsp.

Kentti [01.01.2007 18:33:39]

#

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?

Kentti [01.01.2007 20:54:40]

#

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?

Antti Laaksonen [01.01.2007 21:03:14]

#

Hyvä tietolähde on HelpPC, jossa on paljon tietoa mm. keskeytyksistä (interrupts).

Kentti [01.01.2007 21:10:17]

#

Kiitos. Tuota täytyykin tutkia.. :)

pukki [06.01.2007 01:30:04]

#

http://www.ctyme.com/rbrown.htm

Tuo on aika klassinen referenssi, josta löytyy vastaus moneen pulmaan.

JrPr [10.01.2007 11:14:25]

#

pukki kirjoitti:

http://www.ctyme.com/rbrown.htm

Tuo on aika klassinen referenssi, josta löytyy vastaus moneen pulmaan.

Ainakin hyvä keskeytysluettelo tuolla on.

Metabolix [10.01.2007 20:32:43]

#

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.

Krisu [11.01.2007 00:57:04]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta