jellemzően fő
Az ötlet, hogy írni ezt a cikket is hozzám, mikor az egyik kollégám kénytelenek voltak átesniük során CS egyetemünkön. Kerestünk egy módja, hogy írjon kijavítani a programot úgy, hogy átmegy a vizsgálatokat, de egyik sem a vizsgálatok nem tudták megérteni, hogyan és miért működik. Így kezdtem emlékezni a trükkök C, melyeket egyszer látott a régi kódot, és ezek egyike volt elég szórakoztató. Az az elképzelés, ez a trükk hozzám, mert a blog neve «fő általában egy funkció». Azt gondoltam, „és milyen esetekben nem lehet fő funkciója?” Nézzük meg!
Ha szeretné letölteni a forráskódot ezt a cikket, én írt itt. Felhívjuk figyelmét, hogy írtam, hogy a Linux 64 bites, és akkor lehet, hogy állítsa be az általa platform.
Szeretem és azt hiszem, egy csomó fejlesztő, keresi a választ arra a kérdésre, a következők szerint. 1. lépés: A keresést a Google. 2. lépés: kapcsolja be a vonatkozó valamennyi hivatkozást az első oldalon. Ha a probléma továbbra is fennáll, tudom megváltoztatni egy lekérdezést, és ismételje meg az egészet elölről. Ezúttal szerencsém volt, és az volt a válasz az első keresés StackOverflow. 1984-ben megnyerte a rövid program IOCCC. fő-ban közölték, mert: rövid fő [] =. és valahogy működött! Sajnos, azt írta egy teljesen más architektúra és fordító, és nem voltam képes rá, hogy összegyűjtse, hogy mit csinál, de ítélve az a tény, hogy ez csak egy számsor, nem tudtam elképzelni, hogy ők voltak az byte összeállított egy tömbben kódot, amelyet egyszerűen behelyezhető a memóriában a hely fő.
Miután elfogadta az elmélet, hogy a kód a program - összeállított funkció fő. formájában jelenik meg egy tömb, lássuk, tudunk írni egy kis programot, és ismételje meg ezt a trükköt.
Kiváló! Sikerült! Majdnem ... Szóval, mi a következő cél -, hogy nyomtatni valamit a képernyőn. Amennyire emlékszem, akkor szerelő a lefordított kódban, utasítások szakasz és az adatok részben. Az a rész végrehajtható parancsokat, de nem változtatja meg a kódot, és az adatok fejezetben a változó adatok, amelyeket nem lehet elvégezni. A mi esetünkben, akkor csak töltse ki a kódot a fő funkciója. így bármi, amit hozott a Data szakasz elérhetetlen számunkra. Meg kell találni a módját, hogy egy húr «Helló világ!» A fő funkciója, és olvassa el azt.
Kezdtem azt hinni, hogy írhat a legkevesebb a sorok számát. Mert tudtam, hogy mi fog programozni for Linux 64 bites, nevezhetném a rendszer parancsot írni. amely pedig valamit a képernyőn. Én, persze, tudom, hogy ő aztán nem használhatja szerelő, de ugyanakkor örülök, kaptam ezt az élményt. Kezdjük a beépített szerelő GCC nem volt könnyű, de amikor többé-kevésbé megszokott, a dolgok gyorsan ment.
Eleinte nagyon nehéz volt. Kiderült, hogy minden, amit lehet tanulni a szerelő egy keresőprogram, ez egy régi-ovsky az Intel szintaxist, és a 32 bites architektúra. Azt is meg kellett lefordítani a kódot egy 64 bites rendszert anélkül, hogy speciális fordító zászlók. Ez azt jelenti, nincs zászlók és fordító beállításai semmilyen további lépést kapcsoló és a beépített szintaxis GCC ATT. A legtöbb időt töltöttem a keresési információt az assembler a 64 bites rendszereken! Talán rossz kinézetű. Itt élveztem leginkább próbálgatással. Csak azt akartam, hogy a vonal «Helló világ!» A képernyőn a beépített szerelő, miért olyan nehéz ez? Azok számára, akik szeretnék megtanulni, hogyan kell ezt csinálni, azt ajánlom, nézze meg ezeket a területeket: Linux syscall listán. Bemutató Inline Asm. Különbségek az Intel és az ATT szintaxis.
Végül elkezdtem kiderülhet többé-kevésbé elkülönülő ASM-kód, amely még működött. Emlékezzünk rá, a célom az, hogy írjon egy fő, ami egy tömb ASM-utasítások megjelennek a képernyőn «Hello World».
>>> hex_string = "554889E5B801000000BB01000000BE10054000BA0D0000000F05B83C00000031DB0F0548656C6C6F20576F726C64210A5D". dekódolni ( "hex")
>>> tömb. array ( 'B'. hex_string)
array ( 'B'. [85. 72. 137. 229. 184. 1. 0. 0. 0. 187. 1. 0. 0. 0. 190. 16. 5. 64. 0. 186. 13. 0 . 0. 0. 15. 5. 184. 60. 0. 0. 0. 49. 219. 15. 5. 72. 101. 108. 108. 111. 32. 87. 111. 114. 108. 100. 33 . 10 93])
Gondolom, ha a bash és a unix tudásom volt magasabb szinten, azt is megtalálta a módját, hogy ez egy kicsit könnyebb, de a Google válaszul valami hasonló «hex dump összeállított funkció» ad néhány kérdésre, hogy hogyan kell nyomtatni 16 -richny lerakó különböző nyelveken. Ennek ellenére, most már egy sor vesszővel elválasztott számot képviselő a funkciót. Próbáljuk kell írni, hogy egy új fájlt és ellenőrizze, hogy a trükk működni fog. Itt van, mi történt.