Programování v hexadecimální soustavě

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: DjH
Datum: 18.6.2007
Hodnocení/Hlasovalo: 1/3

Zde se dozvíte jak napsat prográmek v hexadecimální soustavě. Nebudou k zahození základní znalosti assembleru. Dneska si vytvoříme (jak jinak) prográmek "hello world", s příponou *.com.

Nebudem zdržovat...dem hned na věc...
P.S. pokud znáte assembler aspoň trochu dobře, tak se vyznáte...

Naučíme se programovat pomocí hexeditoru. Ano slyšíte (nebo čtete...kdoví co vlastně děláte...) dobře.
Nečekejte nějaké týdení sezení u hexeditoru...dnes si naprogramujeme jednoduchý prográmek.
On vlastně nic nedělá, kromě toho že vypíše v příkazové řádce "hello world".
Z textu vyplívá, že se bude jednat o jednoduchý program, který běží pod příkazovou řádkou.
Ano, prográmek "hello world" vám poběží i v DOSu,jestli Vám to k něčemu bude. A abych nezapomněl,
jedná se o *.com a ne o *.exe (na programování *.exe v hexeditoru se možná podíváme příště...)

Vytvoříme si teda nový soubor...třeba hw.com (jako hELLO wORLD...). Zatím má 0 bytů...
Otevřeme si ho v nějakém dobrém hexeditoru...
a začnem...

"Namačkáme" hexadecimálně E9 (233 decimálně). E9 je jakoby v assembleru "jmp" - tedy skok na...
řetězec "hello world" má 11 znaků. Pro korekci přidáme skok na nový řádek a ukončovací znak "$". To je dohromady
14 znaků (hello world + "13" + "10" + $). Tedy za náš "jmp" (E9) přidáme hexadecimálně "0E" a "00". 0E je
decimálně 14, tedy jmp o 14 znaků. Za "00" (mezera, prázdný byte) napíšeme naše slavné "hello world" zmáčknem [Enter]
(popřípadě napíšem "0D" (13 dec.) "0A" (10 dec.)) a napíšem $.
Napsané teda už máme -

E9 0E 00 68 65 6C 6F 20 77 6F 72 6C 64 0D 0A 24

Znovu si to rozeberem =>

E9 - "jmp"
0E - "14" (tedy jmp o 14 znaků)
00 - prázdný bit (za ním následují data...)
68 - "h"
65 - "e"
6C - "l"
6C - "l"
6F - "o"
20 - " " (mezera...[mezerník]...)
77 - "w"
6F - "o"
72 - "r"
6C - "l"
64 - "d"
0D - decimálně 13
0A - decimálně 10 (13+10=jakoby [enter]) (13 skok na nový řádek, 10 skok na začátek řádku)
24 - "$" - ukončovací znak (značí konec "stringu")

...tohle byla ještě procházka růžovým sadem...teď příjde peklo...

...doteď jsme zadali data (hello world) a "jmp" na začátek znaků který vlasně ještě neexistuje
páč sme ho nenapsali. Před námi je dát příkaz k vypsání stringu a program ukončit a
vrátit do DOSu. V assembleru by to bylo něco jako tohle:

mov ah,9 ;....
int 21h ;pokud je v ah 9 =>vypiš string (z ax který je v našem programu zapsaný jako "00")
mov ah,4ch ;...
int 21h ;pokud je v ah 4c =>ukonči program a vrať se do DOSu...

Jak zapsat funkci "mov"?
Jednoduše...apostrofem (hex.zn. "B4")
AH procesor je hex. "BA".
A jak zapsat funkci "int" (interupt)?
Taky jednoduše. Hex. zn. "CD" (dec. 205)
tedy pokračujem za "$" (hex. "24"):

B4 - mov
09 - 9 dec. je 09 hex...(mimochodem-hex 09 je [tab]...)
BA - ...do "dx"
03 - tři znaky od začátku začíná "string"
01 - začni vypisovat od prvního znaku (03+01=čtvrtý znak začíná h..=>ello world...)
CD - int...
21 - ...21 (int 21 hexadec. (31 dec.) => interupt "zavolá DOS", ten se mrkne co je v "ah". Najde tam 9. Tzn. vypiš string. Tak ho teda vypíše...("hello world" je na světě)..ale...
B4 - mov
4C - 4c hex. (76 dec.) => 4c znamená pro následující DOSovou funkci int 21(h) aby ukončil program a vrátil se do DOSu
CD - int
21 - 21h (end...)

Táák, to byl pro mě záhul to psát... Až budu mít čas taxe mrknem jak vytvořit jednoduchý Messagebox s nějakou
zprávou a možná i funkcí, aby to nebylo tak stereotypní. Samozřejmě v *.exe.

Nakonec vypíšu celý hex. kód:

E9 0E 00 68 65 6C 6C 6F 20 77 6F 72 6C 64 0D 0A 24 B4 09 BA 03 01 CD 21 B4 4C CD 21

uložte si to jak chcete, ale pod koncovkou *.com!!!...

otevřte si cmd.exe a zadejte path k Vašemu *.com souboru. Vypíše se Vám "hello world" s "enterem" (skokem na další řádek) a znovu spustí DOS.

Samozřejmě že místo hello world můžete napsat cokoliv, ale musí to být 11ti znakové. Pokud by to mělo být delší nebo kratší,
museli byste přepsat druhý byt na počet znaků vašeho stringu a k němu připočítat trojku (13+10+$ => tj.3 byty).
Ve stringu nesmí být dolar, protože by ho počítač pochopil jako konec stringu a nic by vám program nenapsal, v horším
případě by vypsal chybovou hlášku.

Pokud byste měli připomínky nebo potíže, nebojte se obrátit na ICQ 319-960-895, popř. na mail hacker.demon@seznam.cz
S pozdravem DjHacker...