Tuli taas assemblerilla pikselinpiirtoohjelmaa ohjelmoidessa vastaan seuraavanlainen ongelma: Datan määrittelyssä offsetin kanssa toimii oikein equ ja dw (declare word?) kanssa word ptr. Mutta kun yritän käyttää dw:n kanssa offsetia tulee aivan muuta kuin pitäisi. En oikein ymmärrä tuon offsetin toimintaa, mutta kun ei tutoriaalistakaan käynyt selitystä ilmi.
Oikein toimivat:
rivi equ 0064h (data) mov bx, offset rivi (koodi)
rivi dw 0064h (data) mov bx, word ptr [rivi] (koodi)
Väärin toimiva:
rivi dw 0064h (data) mov bx, offset rivi
EQU on käytännössä sama kuin VB:n Const, C++:n const jne. Eli jos sinulla on:
erski equ 17
Määrittelee se, että jokainen "erski" joka koodista löytyy tulee korvata luvulla 17.
Offset taasen palauttaa jonkun tietyn muuttujan, funktion tms. muistiosoitteen.
Omissa esimerkeissäsi:
rivi equ 0064h (data) mov bx, offset rivi (koodi)
Tuo voi mennä assemblerista läpi, ja se varmaan tajuaakin tunkea bx:n tuossa tapauksessa tuon 64:n.. en sitten tiedä, mutta ruman näköistä ja epäsuotavaa tuollainen ainakin on :) Jos haluat määritellä vakion "rivi" 64:ksi niin:
rivi equ 0064h ; rivi=64h mov bx, rivi ; bx=64h
rivi dw 0064h (data) mov bx, word ptr [rivi] (koodi)
Tässä pätkässä määrittelet sanan (word), alkuarvonaan 64h. "word ptr" prefiksi ei ole pakollinen, assembleri nimittäin tietää, että rivi on word, ja bx on word. Eli:
rivi dw 0064h ; word-muuttuja, arvo 64h mov bx, rivi ; bx = 64
Kelpaa myös. Ja pidemmän päälle ei noita prefiksejä jaksakaan kirjoitella kun vain silloin kun ne todella ovat tarpeen. Huomaa myös että siirrettäessä arvoa muuttujasta hakasulkuja ei ole pakko käyttää, toki sekin on mahdollista.
rivi dw 0064h (data) mov bx, offset rivi
Tämä ei toimi koska olet määritellyt muuttujan "rivi", ja siirrät bx:ään "rivi":n muistiosoitteen: siis osoitteen, missä itse muuttuja sijaitsee, et tämän muistiosoitteen sisältöä.
Offsetin toiminta on se, että se palauttaa muuttujan/funktion tms. muistiosoitteen :)
Kiitoksia, täytyy sanoa, että ainakaan asmqrssissa ei selitetä asioita aivan perusteellisesti...no saapa noita kattavia vastauksia täältäkin :).
Miten muuten tutkitaan näpäimistöä, että mitä nappia on painettu tai painetaan?
Jos sitä joskus tekisi jonkunlaisen pienen pelin, niin tietäisipä tämänkin asian.
Jos et muuten vielä tiennyt niin tsekkaas HelpPC:
http://members.tripod.com/~oldboard/assembly/
Siellä on kivat selostukset mm. keskeytyksistä (DOS:ile taisit olla koodaamassa..).
En ole pitkään aikaan itse DOS:ille väsäillyt mitään mutta int 16 funktio 11h (AH = 11h) voisi ajaa asiasi (siis _pienessä_ pelissä). "Kunnon pelissä (tm)" kannattanee asennella oma näppiskeskeytys (int9).. mutta siitä ei nyt sen enempää :)
nabula: mov ah, 11h int 16h jnz nabula ; tsekkaillaan olisiko nappia bufferissa xor ax, ax int 16h ; luetaan (poistetaan bufferista)
Ei täyttä varmuutta yo. koodin toimivuudesta mutta kokeile..
AH = scankoodi ja AL ASCII-koodi. Scankoodi -lista:
http://members.tripod.com/~oldboard/assembly/
Jos hyvää asmi-opasta haet niin lue Art of Assembly (AoA ;).. Google löytää. HLA:sta ei tarvitse välittää.
Aihe on jo aika vanha, joten et voi enää vastata siihen.