Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB: Assemblyn muuttaminen heksamuotoon

Juhko [16.06.2007 11:59:09]

#

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.. :(

setä [16.06.2007 12:08:23]

#

https://www.ohjelmointiputka.net/keskustelu/13928-assembly-kääntäjät

Antti Laaksonen [16.06.2007 21:51:46]

#

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?).

Juhko [17.06.2007 11:44:46]

#

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

moptim [21.06.2007 12:56:43]

#

http://koti.mbnet.fi/qwauk/asmopas.txt

Vastaus

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

Tietoa sivustosta