Miten saan Assembly-koodin muutetuksi siihen heksamuotoon niin, että QBasicin CALL ABSOLUTE ymmärtäisi sitä?
Sori, kuulostan tyhmältä vasta-alkajalta, mutta kun Assemblyn käyttö QB:llä on unohtunut opinnoista.. :(
DOSin ja Windowsin mukana tuleva DEBUG on kuin luotu tähän tarkoitukseen. Ohjelma käynnistetään kirjoittamalla komentoriville "debug". Tämän jälkeen ilmestyy DEBUGin oma komentorivi. Komennoilla a ja u käännetään assemblystä konekieleen ja toisinpäin, q sulkee ohjelman ja ? näyttää ohjeen.
Tässä tulee pari keskustelua DEBUGin kanssa. Ensimmäisessä muutetaan konekieliseksi pelkkä komento "int 21", ja toisessa muutetaan konekieliseksi kokonainen ohjelma, joka tulostaa ruudulle kirjaimet O ja P.
C:\antti>debug -a 100 0CAF:0100 int 21 0CAF:0102 -u 100 0CAF:0100 CD21 INT 21 0CAF:0102 B265 MOV DL,65 0CAF:0104 CD21 INT 21 0CAF:0106 CA0000 RETF 0000 0CAF:0109 FEC2 INC DL 0CAF:010B CD21 INT 21 0CAF:010D CA0000 RETF 0000 0CAF:0110 6E DB 6E 0CAF:0111 206472 AND [SI+72],AH 0CAF:0114 69 DB 69 0CAF:0115 7665 JBE 017C 0CAF:0117 2025 AND [DI],AH 0CAF:0119 3120 XOR [BX+SI],SP 0CAF:011B 68 DB 68 0CAF:011C 3400 XOR AL,00 0CAF:011E 9E SAHF 0CAF:011F 0C6F OR AL,6F -q
Komentojen a ja u jälkeen tulee kirjoitettava tai näytettävä muistipaikka, ja omaa ohjelmaa voi alkaa kyhätä vaikka kohdasta 100 alkaen. Komento a muuttaa assemblyä konekieliseksi, kunnes kirjoitetaan tyhjä rivi. Komento u näyttää muistin sisällön heksamuodossa ja assemblynä. Ensimmäisellä rivillä näkyy, että "int 21" on heksamuodossa "CD21". Loput rivit ovat muistissa valmiina ollutta tietoa, josta ei tarvitse välittää.
C:\antti>debug -a 100 0CAF:0100 mov ah, 2 0CAF:0102 mov dl, 4f 0CAF:0104 int 21 0CAF:0106 inc dl 0CAF:0108 int 21 0CAF:010A -u 100 0CAF:0100 B402 MOV AH,02 0CAF:0102 B24F MOV DL,4F 0CAF:0104 CD21 INT 21 0CAF:0106 FEC2 INC DL 0CAF:0108 CD21 INT 21 0CAF:010A C2CD21 RET 21CD 0CAF:010D CA0000 RETF 0000 0CAF:0110 6E DB 6E 0CAF:0111 206472 AND [SI+72],AH 0CAF:0114 69 DB 69 0CAF:0115 7665 JBE 017C 0CAF:0117 2025 AND [DI],AH 0CAF:0119 3120 XOR [BX+SI],SP 0CAF:011B 68 DB 68 0CAF:011C 3400 XOR AL,00 0CAF:011E 9E SAHF 0CAF:011F 0C6F OR AL,6F -q
Konekieleksi käännettäviä komentoja voi siis kirjoittaa saman tien useita, lopuksi pitää vain kirjoittaa tyhjä rivi. Tässä tehtiin kokonainen ohjelma, joka tulostaa kirjaimet O ja P keskeytyksen 21 funktiolla 2. Heksamuodossa ohjelma on "B402B24FCD21FEC2CD21".
Seuraava vaihe on siirtää konekielinen ohjelma QBasiciin. Heksaluvut täytyy pystyä kopioimaan sellaisenaan muistiin, mikä onnistuu melko joustavasti komennolla POKE. Konekielisen ohjelman loppuun täytyy vielä lisätä komentoa "retf" vastaava koodi "CB", joka poistuu konekielisestä ohjelmasta. Lopullinen ohjelma näyttää seuraavalta:
' riittävästi tilaa konekieliselle ohjelmalle DIM koodi%(100) ' luetaan ohjelman pituus READ pituus% ' määritetään segmentti ja siirtymä DEF SEG = VARSEG(koodi%(0)) alku% = VARPTR(koodi%(0)) ' luetaan heksaluvut muistiin FOR i% = 0 TO pituus% - 1 READ j% POKE alku% + i%, j% NEXT CLS ' suoritetaan ohjelma CALL Absolute(alku%) ' ohjelman pituus DATA 11 ' konekielinen koodi heksamuodossa DATA &HB4, &H02, &HB2, &H4F, &HCD, &H21 DATA &HFE, &HC2, &HCD, &H21, &HCB
Ohjelman suorituksen jälkeen ruudulla pitäisi lukea teksti "OP" (arvaatko, mistä on lyhenne?).
Kiitos ohjeista, kokeilen heti, kun pääsen qb-koneelleni (kaupungissa oleva on rikki ja toimiva maalla, tässä koneessa on huono). Antin ohjeen ymmärsin hyvin, nyt täytyy vain alkaa opetella Assemblyä.
Ps. Jos joku tietää hyvän Assembly-oppaan...
ps. OP = Ohjelmointiputka
Aihe on jo aika vanha, joten et voi enää vastata siihen.