Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Assembly: Asm tutoriaaleja

Sivun loppuun

peki [18.04.2004 15:58:51]

#

Olisi kiva tietää, mistä saisi käsiinsä ei niin aloittelijalle suunnattuja asm tutoriaaleja.
Mieluiten nämä tutoriaalit saisivat käsitellä tilan 13h grafiikkaa(miksei myös muiden tilojen).
Hallitsen tällä hetkellä rekisterit ja peruskomennot, tosin muisti segmentit(si ja di rekisterit) ovat vähän hakusessa. Eli sen tasoisia ohjeita jos joku tietää.

Edit: Ai niin. Kääntäjänä on NASM

Edit2: Kysytäänpä nyt vielä: Tietääkö joku, miksi visual studio .net 2003:n inline assembler ei anna siirtyä 13h näyttötilaan.
Se vain valittaa, että ei saa lukea osoitteesta FFFFF. Koodi on tällainen:
mov ax, 13h
int 10h
Tarkka errori:
Unhandled exception at 0x00411a32 in kk.exe: 0xC0000005: Access violation reading location 0xffffffff.

thefox [18.04.2004 22:13:35]

#

Windowsissa näyttötiloja kuuluu vaihtaa ainoastaan käyttöjärjestelmän funktioilla. Suojatussa tilassa (ja varsinkin ring-3:ssa, käyttäjätilassa, jossa kaikki perusohjelmat ajetaan) ei keskeytyksiä voi käyttää.

Art Of Assembly Language Programming: http://webster.cs.ucr.edu
HLA on melko turha ainakin omasta mielestäni, joten vaikka sivulla sitä kovasti hehkutetaankin, haluat varmastikin keskittyä tähän: http://webster.cs.ucr.edu/AoA/DOS/AoADosIndex.html

peki [19.04.2004 15:19:31]

#

Tuo AoA oli aika hyvä, mutta pikaisesti vilkaistuna en löytänyt mitään grafiikasta(ainakaan kun hain sanoilla graphics, graphic, vga, svga, pixel). Keskeytyksestä int 10h löytyi sentään jotain pientä, jonka ennestään tiesin.
Hakisin siis tietoa pikselien plottauksesta ja luvusta. Tiedän asian liittyvän niihin muistisegmenntteihin, eli jonnekin pitäisi kirjoittaa ja jotain, mutta en tiedä mitä ja minne.
Myös juuri se käsky, missä ne rekisterit ovat [ ] sulkujen sisällä hämää. Tiedän sen viittaavan muistiosoitteisiin, mutta enempää en ymmärrä. Eli esim: mov [di + 500h], al
Bittikarttojen tulostuksesta näyttöön(tiedän, tiedän, löytyy koodivinkeistä). En siitä vaan mitään ymmärtänyt.
Demokoodausta assemblerillä ja kaikkea siihen liittyvää toisin sanoen haen.

Edit: Jos viitsisit kertoa, että onko turvallista kirjoittaa kaikkiin ds:n tarjoamiin osoitteisiin. Eli jos ohejelman alussa vaikka teen näin: mov ds:[10h], ax niin onko tämä turvallista?

peki [20.04.2004 17:12:29]

#

Mihin kaikkiin muistiosoitteisiin on turvallista kirjoittaa?

Antti Laaksonen [20.04.2004 19:26:51]

#

Nopeinta on muuttaa pikselien väri suoraan näyttömuistissa, joka alkaa segmentissä a000h. Näyttötilassa 13h pikselit ovat mukavasti peräkkäin yhdessä segmentissä. Hakasulut tarkoittavat, että tietoa ei tallenneta rekisteriin itseensä vaan rekisterin osoittamaan muistipaikkaan. Tässä on lyhykäinen esimerkki (toivottavasti toimii NASMilla), joka siirtyy grafiikkatilaan, täyttää näytön sinisellä värillä, odottaa näppäimenpainallusta ja palaa jälleen tekstitilaan.

   mov ax, 0a000h    ; valitaan näyttömuistisegmentti
   mov ds, ax
   mov ax, 0013h     ; siirrytään 320x200-näyttötilaan
   int 10h
   mov bx, 0         ; alustetaan piirtokohtalaskuri
   mov cl, 1         ; valitaan piirtoväri (1 = sininen)
piirto:
   mov [bx], cl      ; muutetaan pikselin väri
   inc bx            ; kasvatetaan piirtokohtalaskuria
   cmp bx, 320*200   ; jos kaikki pikselit on piirretty...
   jne piirto        ; ...silmukka päättyy
   mov ah, 01h       ; odotetaan näppäimenpainallusta
   int 21h
   mov ax, 0003h     ; palataan takaisin tekstitilaan
   int 10h
   mov  ah, 4ch      ; poistutaan ohjelmasta
   int  21h

Myös tämä sivu on mahtava apu assembly-ohjelmoinnissa:
http://members.tripod.com/~oldboard/assembly/

lainaus:

Mihin kaikkiin muistiosoitteisiin on turvallista kirjoittaa?

Yleensä pahin mahdollinen seuraus väärään muistiosoitteeseen kirjoittamisesta lienee se, että kone täytyy käynnistää uudestaan. Tällöin muisti näet nollautuu. Älä silti kirjoittele minne sattuu!

peki [20.04.2004 19:29:34]

#

Kiitos! Tuo auttoi suunnattomasti.
Edit: Noista piirtoväreistä... ...Miksi juuri 1 on sininen. Onko niissä jokin logiikka?
Edit: Koodi muuten toimi täydellisesti

Antti Laaksonen [20.04.2004 19:35:26]

#

Kyllä niissä jonkinlainen logiikka piilee:
https://www.ohjelmointiputka.net/keskustelu/4730-näettekö-aineettomia-asioita-väreinä-synestesiaa

Oletusväreihin ei kuitenkaan tarvitse tyytyä, vaan ne voi valita haluamakseen 262144 värin paletista.

peki [20.04.2004 19:38:06]

#

Miten tuo paletti taasen toimii? En sitä ole koskaan ymmärtänyt, vaikka yrittänyt olen(vb:n kanssa palettia ei hirveästi tarvinnut)
Tiedän, että pitää lähettää johonkin porttiin jotain, mutta en tiedä mihin. enkä myöskään mitä lähettää.

Antti Laaksonen [20.04.2004 19:47:02]

#

Ensin lähetetään porttiin 3c8h muutettavan värin numero, ja sen jälkeen porttiin 3c9h värin R, G ja B. Väriarvojen asteikko on 0 - 63, ei siis 0 - 255. Tässä on edelliseen ohjelmaan liittyvä lisäys, joka muuttaa värin 1 punaiseksi. Jostain kumman syystä out-komentoa täytyy käyttää rekistereiden dx ja al kautta, mikä pidentää periaatteessa yksinkertaista koodia.

   mov dx, 3c8h ; valitaan värinumero
   mov al, 1
   out dx, al
   mov dx, 3c9h ; valitaan väri
   mov al, 63   ; R
   out dx, al
   mov al, 0    ; G
   out dx, al
   mov al, 0    ; B
   out dx, al

peki [20.04.2004 19:52:37]

#

Kiitos taas.

peki [21.04.2004 19:24:29]

#

Mikä muuten on paletin maksimikoko, eli kuinka monta väriä saan palettiin määritellä(tila on edelleen 13h)?

Antti Laaksonen [21.04.2004 21:02:24]

#

Värejä voi olla yhtä aikaa 256 (0 - 255) tilassa 13h.

peki [22.04.2004 16:34:03]

#

Ahaa. Tuosta siis tulee se, että jossain näyttötilassa on 256 väriä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta