Tässäpä pieni esimerkki kuinka käsitellä hiirtä assemblylla. Koko hiiren käsittely käy keskeytyksellä 33h. Ja jollain subfunktiolla. Tarkempia ohjeitä löytyy laamatutista luvusta 5.5, vaikka se onkin C ohjelmointia käsittelevä opas. Tämä koodiesimerkki ei tee itseasiassa mitään muuta, kuin vain näyttää hiiren kursoria ruudulla, ja napinpainalluksen jälkeen lähtee pois. Itselläni on kehitteillä hiiri kirjasto QB:lle, joka on ohjelmoitu 100% assemblylla. Sen lähdekoodin voin joskus laittaa tänne.
.MODEL SMALL .STACK 20h .DATA assmouse DB 13,10,"Liikuttele hiirtä, se toimii!",13,10,"$" nomousee DB 13,10,"Ei ole hiirtä!$" .CODE ;Tekstin tulostus mov ax, @data mov ds, ax mov dx, OFFSET assmouse mov ah, 9h int 21h ;Hiiren alustus xor ax, ax int 33h cmp ax, 0h je nomouse ;Jos ei hiirtä ;Hiiren näyttö mov ax, 1h int 33h ;Napin painalluksen odotus mov ah, 0h int 16h ;Hiiren piilotus mov ax, 2h int 33h jmp loppu ;Jos ei hiirtä nomouse: mov ax, @data mov ds, ax mov dx, OFFSET nomousee mov ah, 9h int 21h ;Ohjelman lopetus loppu: mov ax, 4c00h int 21h END
Voin vielä selittää, että saat selville hiiren X ja Y koordinaatit, sekä hiiren namiskat subfunktiolla(ah) 3h ja keskeytyksella 33h(kuten kaikki muutkin hiiren käsittelyt) jolloin CX on x koordinaati dx y koordinaati ja bx on nappien tila bitti 0 on vasen 1 oikea ja 2 keskimmäinen.
Olisi vähän optimoinnin varaa tuossa ;)
Joo, kyllähän siinä, mutta esimerkiksi ihan ok, kai? Ja olisihan siinä voinut demonstroida tuota hiiren x ja y koordinaatien selville saantia.
Turhia moveja tuosta kyllä löyty... Kiireessä laitoin, ni unohtu. Mut tarkoitus kuitenkin tulee selville, toivottavasti.
Tuota, olen itse assembly-friikki ja päätin kommentoida koodia.
cmp ax,0h voi korvata or ax,ax käskyllä joka on pienempi. eli koodi tulisi tuossa kohti olemaan seuraavanlainen: or ax,ax
jz nomouse
Noh, aika lyhyt oli koodi, ois voinu liittä osoittimen vaihdon.
Miten se osoitin vaihdetaan?!
Hmm... voishan semmosen koodinpätkän tänne sendiä. Nyt vasta huomasin viestisi ;)
Kääntyykö yasmilla(nasm yhteensopiva)?
Aihe on jo aika vanha, joten et voi enää vastata siihen.