Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Exen teko omalla koodilla

Sivun loppuun

temu92 [22.08.2006 11:45:10]

#

Jos tekisin vaikka Brainfuck tulkin, miten saisin sen tuottamaan exen taikka jonkin suoritettavan tiedoston. Ei mitään siis .batteja tai tälläsiä

pukki [22.08.2006 15:43:08]

#

Jos EXEn haluat, niin joudut koodaamaan ihka oikean kääntäjän. Tai sitten jonkun GCC-frontendin(?).

En ole asiaan juurikaan perehtynyt, joten lopetan tähän ja heitän pallon jollekin joka on.

temu92 [22.08.2006 17:29:46]

#

Koska exeähän sanotaan kans binääriksi asia kai liittyy jotenkin binääriin eli 0101010100001001 juttuun

FooBat [22.08.2006 18:01:20]

#

Helpoimmalla saat bf-koodista ajettavan exen, kun teet ohjelman(kääntäjän), joka kääntää bf-koodin ensin c-koodiksi ja sitten käännät c-ohjelman c-kääntäjällä binääriksi.

Brainfuck koodin kääntäminen c-koodiksi on erittäin helppoa, kuten brainfuck tutoriaaleista käy selväksi.

Binääri-jutulla tarkoitetaan sitä, että ohjelma on tietokoneen ymmärtämässä numeerisessa muodossa sen sijaan, että se olisi ihmisten ymmärtämässä koodi-muodossa. Käytännässä binäärimuodossa jokainen binäärimuodossa oleva numerokoodi vastaa jotain prosessorin käskyä tai niiden parametreja yms. Jos haluat itse tehdä kääntäjän joka tuottaa tälläistä koodia joudut tutkimaan kohdealustan käskykantaa, tutkia mitä prosessorin käskyjä tarvitset käännettävän ohjelman suorittamiseen ja kirjoittella sitten tiedostoon käskyjä vastaavia numeroita.

Antti Laaksonen [22.08.2006 18:32:50]

#

Ohjelma täytyy kääntää konekielisiksi komennoiksi, jotka tietokone osaa suorittaa. Jokainen konekielinen komento muodostuu yhdestä tai useammasta merkistä. Sinun täytyy siis tarkoin tuntea komentojen muodostuminen ja tallentaa tiedostoon oikeat merkit.

Tässä on konekielinen ohjelma, joka tulostaa kirjaimen A:

B402          MOV     AH,02
B241          MOV     DL,41
CD21          INT     21
B44C          MOV     AH,4C
CD21          INT     21

Tässä jokainen konekielinen komento muodostuu kahdesta merkistä. Ensimmäinen komento muodostuu merkeistä B4 ja 02. Riveillä näkyvät myös konekielisten komentojen selkokieliset vastineet. Kaikki luvut ovat 16-järjestelmässä, eli ne muodostuvat numeroista 0 - 9 ja kirjaimista A - F.

Komento MOV kopioi luvun rekisteriin ja INT aiheuttaa keskeytyksen. Kun rekisterissä AH on luku 2 ja kutsutaan keskeytystä 21, näytölle tulostetaan rekisterissä DL oleva merkki. A-kirjaimen tunnus on 41. Kun rekisterissä AH on luku 4C ja kutsutaan keskeytystä 21, ohjelma sulkeutuu.

Tästä myös huomataan konekielisen ja selkokielisen ohjelman yhteys. Merkit 02, 41, 21, 4C ja 21 ovat molemmissa samat. Jokaisella komennolla on myös oma tunnuksensa. MOV voi olla B4 tai B2, INT taas on CD. MOV-komennon tunnus riippuu siitä, mihin tietty luku kopioidaan.

Tämän ohjelman voisi luoda seuraavasti C-kielellä:

FILE *tiedosto;
tiedosto = fopen("MERKKI.COM", "w");
fprintf(tiedosto, "%c%c%c%c%c", 0xb4, 0x02, 0xb2, 0x41, 0xcd);
fprintf(tiedosto, "%c%c%c%c%c", 0x21, 0xb4, 0x4c, 0xcd, 0x21);
fclose(tiedosto);

Nyt tuloksena on ajettava tiedosto MERKKI.COM (vastaa EXE-tiedostoa).

Saman ohjelman merkit voi tietysti ilmoittaa monella tavalla.

16-järjestelmässä:
B4 02 B2 41 CD 21 B4 4C CD 21

10-järjestelmässä:
180 2 178 65 205 33 180 76 205 33

2-järjestelmässä:
10110100 00000010 10110100 01000001 11001101
00100001 10110100 01001100 11001101 00100001

Juuri tämä viimeinen esitysmuoto on sitä kuuluisaa binäärikoodia. Nimitys on siinä mielessä hassu, että minkä tahansa tiedoston voi ilmoittaa samassa muodossa.

moptim [22.08.2006 19:42:29]

#

jos minulta kysytään niin yksinkertaisin vaihtoehto (minkä olen tehnyt äärimmäisen yksinkertaiselle "kielelle") on:
Tee oma tulkki. (ei ole sitten kääntäjä)

zorm [22.08.2006 20:17:27]

#

Ainahan voi tehdä ensiksi tulkin ja kun on oppinut enemmän, niin kääntäjän.
Kerroit Antti tuon asian todella hyvin! Ymmärsin kokonaan kuinka tämä konekielinen tiedosto homma toimii. :)
Olisikohan tässä aiheessa jo ainesta asiaa käsittelevään oppaaseen?

temu92 [22.08.2006 23:13:37]

#

eli siis vähän hankalampaa kuin luulinkaan. no, mikäs tässä opetellessa. siis asmia opettelemaan, kai :P

_Pete_ [23.08.2006 10:11:37]

#

Antti Laaksonen kirjoitti:

Tässä on konekielinen ohjelma, joka tulostaa kirjaimen A:

Se on assembler ohjelma eikä konekieli ohjelma.
Assembler kielinen ohjelma käännetään konekielelle.

Tarkennettuna, konekieli on mitä tuossa assembler listauksen
ensimmäisessä sarakkeessa on.

Metabolix [23.08.2006 14:22:55]

#

Että oikein assembler kielinen? xD Assembly-kielinen entintään, ja sehän on siis symbolinen konekieli.

Gwaur [23.08.2006 15:20:51]

#

Ja "assembly":hän on yleisnimitys eikä yksi tarkkalleen tietty kieli. Assemblyllä tarkoitetaan yleensäkin symbolista konekieltä. Assemblyjä on erilaisia eri prosessoriarkkitehtuureille, esimerkiksi x86:lle (PC), 6502:lle/6510:lle (mm. Commodore VIC-20 ja 64) ja z80:lle (mm. TI-86).


Sivun alkuun

Vastaus

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

Tietoa sivustosta