Az alábbi 32 byte-os Hello World! program érdekessége, hogy DOS és CP/M alatt is fut.

Nézzük a programot CP/M alatt (Z-80 assembly):

0100    B4          OR   H
0101    09          ADD  HL,BC
0102    BA          CP   D
0103    0A          LD   A,(BC)
0104    01 CD 21    LD   BC,21CD
0107    C3 17 01    JP   0117
010A                DB   "Hello World!$"
0117    0E 09       LD   C,09
0119    11 0A 01    LD   DE,010A
011C    CD 05 00    CALL 0005
011F    C9          RET

A program a 0x100 címre töltődik be. A program első felében (0x100–0x106) látszólag értelmetlen kód van. Majd a 0x107-es címen lévő utasítással átugorjuk a 0x10a–0x116 címen tárolt szöveget, és a 0x117-en végre elkezdődik a programunk. A C regiszterbe betöltjük a C_WRITESTR funkcióhívás kódját, a DE regiszterbe a szöveg címét, majd a CALL 5-tel meghívjuk magát a funkciót. Ezután a RET visszatér a CP/M-hez.

Nézzük ugyanezt a kódot x86 assembly-re!

0100    B4 09       MOV  AH,09
0102    BA 0A 01    MOV  DX,010A
0105    CD 21       INT  21
0107    C3          RET
0108    17 01
010A                DB   "Hello World!$"

Rögtön értelmet nyer a program elején lévő 7 byte, ami Z-80-on nem csinál semmi hasznosat. Az AH regiszterbe betöltjük a karakterstring írás függvénykódját (a kód ugyanaz, mint a CP/M-en), majd a a DX regiszterbe a string címét. Ezután 0x21 megszakítással meghívjuk az adott DOS-függvényt, végül a RET visszatér a DOS-hoz. A kód többi része (0x108–0x109 és 0x117–01xff) nem érdekes számunkra, hiszen soha nem fog lefutni.

Kis megjegyzés a 9-es DOS-függvényhez. Jól látható, hogy dollárjelet nem tudnánk írni ezzel a funkcióval, hiszen ez a string-lezáró karakter. Gary Kiddal-nak, a CP/M tervezőjének volt a legendás mondása: "Ask Bill [Gates] why the string in [MS-DOS] function 9 is terminated by a dollar sign. Ask him, because he can't answer. Only I know that.".

Vissza