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.
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.
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?
Mihin kaikkiin muistiosoitteisiin on turvallista kirjoittaa?
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!
Kiitos! Tuo auttoi suunnattomasti.
Edit: Noista piirtoväreistä... ...Miksi juuri 1 on sininen. Onko niissä jokin logiikka?
Edit: Koodi muuten toimi täydellisesti
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.
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ää.
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
Kiitos taas.
Mikä muuten on paletin maksimikoko, eli kuinka monta väriä saan palettiin määritellä(tila on edelleen 13h)?
Värejä voi olla yhtä aikaa 256 (0 - 255) tilassa 13h.
Ahaa. Tuosta siis tulee se, että jossain näyttötilassa on 256 väriä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.