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