Jos tekisin vaikka Brainfuck tulkin, miten saisin sen tuottamaan exen taikka jonkin suoritettavan tiedoston. Ei mitään siis .batteja tai tälläsiä
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.
Koska exeähän sanotaan kans binääriksi asia kai liittyy jotenkin binääriin eli 0101010100001001 juttuun
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.
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.
jos minulta kysytään niin yksinkertaisin vaihtoehto (minkä olen tehnyt äärimmäisen yksinkertaiselle "kielelle") on:
Tee oma tulkki. (ei ole sitten kääntäjä)
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?
eli siis vähän hankalampaa kuin luulinkaan. no, mikäs tässä opetellessa. siis asmia opettelemaan, kai :P
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.
Että oikein assembler kielinen? xD Assembly-kielinen entintään, ja sehän on siis symbolinen konekieli.
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).
Aihe on jo aika vanha, joten et voi enää vastata siihen.