Komentář k programu P0
P0 je kostra velmi jednoduchého programu, sestaveného celkem ze 3 segmentů:
Program má dokumentovat základní práci se segmentovými registry a jejich počáteční nastavení při zavedení programu do paměti. Úmyslně není použito zjednodušené definování segmentů direktivami .STACK, .CODE, .DATA atd.
Zásobníkový segment
Definice zásobníkového segmentu
S1 SEGMENT STACK
má následující význam: S1 je jméno segmentu, SEGMENT je klíčové slovo pro definici segmentu, STACK je klíčové slovo označující zásobníkový segment. Při takto definovaném zásobníkovém segmentu je linkerem zajištěno automatické nastavení obsahu registrů SS a SP při zavedení programu do paměti. Velikost segmentu je 100 slov (WORD). Operátor
100 DUP ( )
znamená, že se 100x opakuje to, co je uvedeno v závorce, takže
DW 100 DUP ( ? )
definuje 100 položek WORD. Řádka
S1 ENDS
označuje konec segmentu S1.
Ostatní segmenty
Datový segment D1 a kódový segment C1 jsou definovány podobným způsobem. Rozlišení datový/kódový segment je pouze fiktivní - je to jen záležitost programátora, překladač oba segmenty nerozliší. Program je ukončen direktivou
END TUDY
která definuje vstupní bod programu TUDY. Použití této direktivy nám zajistí nastavení registru CS na začátek segmentu ve kterém je uvedený vstupní bod a nastavení IP na offset (posunutí vzhledem k začátku segmentu) vstupního bodu.
Dvě instrukce NOP na začátku programu nemají žádný význam (jen posouvají vstupní bod programu na jiný offset než 0000h, aby byl zřejmý význam direktivy END TUDY pro nastavení CS:IP). Na začátku programu je nastaven obsah DS na začátek segmentu D1, aby bylo možné použít proměnné v něm definované.
Na konci programu je volána systémová služba EXIT s kódem 4Ch. Návratový kód programu je 00h.
Nastavení registrů po zavedení do paměti
Nastavení segmentových registrů po zavedení programu do paměti je znázorněno na následujícím obrázku:
Situace po zavedení programu do paměti je na následujícím obrázku (okno CPU v Turbo Debuggeru):
V pravém červeném rámečku je zřejmé nastavení jednotlivých segmentových registrů. DS a ES ukazují na PSP, který leží "pod" vlastním programem. Nad ním je zásobníkový segment (SS ukazuje na jeho bázovou adresu 5B7E0h), v SP je jeho délka (00C8h). CS ukazuje na začátek segmentu C1, v IP je offset vstupního bodu (0002h). V levém červeném rámečku je obsah kódového segmentu, resp. segmentu na který je nastaven CS. Mezi řádky s instrukcemi, které TD získal zpětným překladem binární formy programu v paměti jsou vloženy řádky zdrojového kódu ze souboru .ASM. To je umožněno použitím parametrů /zi při překladu a /v při sestavení programu.
Dolní okno zobrazuje obsah datového segmentu na adrese DS:01D0. Protože DS je zatím nastaven na PSP, odpovídá offset zobrazený v levé části tohoto okna (01D0h) vzdálenosti datového segmentu od začátku PSP. Segmenty jsou v paměti uloženy tak, že jejich začátky jsou vždy na adrese dělitelné 16. Proto mezi nimi mohou být malé mezery.
Kromě zdrojové formy (.asm) je k dispozici také protokol o překladu (.lst), mapový soubor (.map) a sestavený program pod DOS (.exe).
Viz též stručný návod k programování v assembleru I8086.
Poslední změna stránky byla provedena 25.02.2002