Asembler x86/Zmienne/FASM
Segmenty
[edytuj]Czym są segmenty zostało wyjaśnione w rozdziale Architektura. Dzielą one kod programu na części ładowane do pamięci. Sposób tworzenia segmentów w asemblerze FASM jest ściśle uzależniony od formatu pliku wyjściowego. Służą do tego różne dyrektywy przyjmujące różne parametry, jednak ogólna zasada jest taka że kod znajdujący się pod taką deklaracją segmentu aż do drugiej deklaracji segmentu jest jego definicją tzn. jest jego zawartością (kod, dane itd.). Poniżej znajdziesz opis tworzenia segmentów w różnych plikach wyjściowych. Dokładny opis tych formatów znajdziesz w rozdziale Formaty plików wykonywalnych.
MZ
[edytuj]Segmenty w tym formacie tworzy się za pomocą dyrektywy segment. Oto schemat jej użycia
segment nazwa [flagi]
W polu nazwa podajemy oczywiście nazwę naszego segmentu (jest ona zupełnie dowolna) a w opcjonalnym polu flagi do wyboru mamy tylko dwie: use16 i use32 oznaczające kolejno że kod w definiowanym segmencie ma być 16- lub 32-bitowy. Przykłady takiej definicji:
segment kodzik
segment inny_kodzik use32
Przy użyciu dyrektywy stack możesz utworzyć stos dla swojego programu. Jej użycie jest banalnie proste. Oto schemat:
stack [rozmiar lub adres_daleki]
W opcjonalnym polu znajdującym się za dyrektywą stack podajemy rozmiar naszego stosu gdy chcemy by był utworzony automatycznie lub adres daleki do naszego stosu, gdy chcemy wykorzystać stos własnej roboty. Gdy nie użyjemy ani tego ani tego dyrektywa tworzy stos o rozmiarze 4096 bajtów. A oto przykłady:
stack ;tworzy stos o rozmiarze 4096
stack 100h ;tworzy stos o rozmiarze 100h (256 decymalnie)
stack moj_stos:poczatek_stosu ;uznaje podany adres za początek naszego stosu
Przy użyciu dyrektywy heap z kolei możesz utworzyć stertę dla swojego programu do dynamicznego przydziału pamięci. Schemat użycia:
heap [max_rozmiar]
Domyślny rozmiar sterty to 65535 bajtów.