     ||||| ||     ||     |
    ||  || ||     |
   ||   || ||     ||||\ ||
  |||||||| ||     |   |  |
 ||     || ||     |   |  |
||      || \||||| \|||/  || 12.1999-02.2000  priv: albi26@poczta.onet.pl
				     	     Web:  www.republika.pl/zamczysko
********************************************************************************

				----------------------
				ASEMBLER STRORY PART 1
				----------------------

----------------------------------------
SPIS TRESCI

1.Wsetpniak
2.Potrzebne narzedzia
3.Systemy liczbowe
4.Procesor
5.Porty
6.Rejestry
  6a.Specyfikacja Intela
7.Flagi
  7a.Specyfikacja Intela
8.Stos
9.Pamiec
10.Przerwania
11.Jak pisac w Turbo Asemblerze
   11a.Uruchamianie programow ASM
   11b.Ogolna skaladnia programow w ASM

----------------------------------------

1.Wsetpniak

Pierwsze pytanie: czy ma sens pisanie turoka na temat ASM ? Przeciesz wszystko zostalo juz 
napisane (zwlaszcza dla poczatkujacych). Ale jak sam sie zorietowalem jest to rozrzucone
po sieci i nigdzie nie ma kompletnej dokumetacji, oczywiscie po PL, bo po nie naszemu
sa swietne teksty...
Chce w tym tekscie napisac wszystko dla newbie (poczatkujacych), sam jeste jeszcze newbie
i moze to pomorze napisac zrozumialy FAQ na ten temat, bo jak ja to rozumiem to kazdy
(przejawiajacy inteligencje) zrozumie. Jeszcze jedno niektre teksty pochodza z innych
FAQow na ten temat, nie bede pisal przy kazdym cytacie skad, 
opis tych tekstow i podziekowania na koncu (najwieksze w 3 czesci).

JESZCE RAZ PRZYPOMNE NIE SA TO WYLACZNIE MOJE TEKSTY JEST TO ZBIOR INNYCH TEKSTOW
ZEBRANE PRZE ZEMNIE I ODPOWIEDNIO ZREDAGOWANE DZIEKI TEMU MASZ WSZYSTKO JAK NA TACY
A JAK CI SIE TO NIEPODOBA TO MOZESZ ORGINALOW POSZUKAC W NECIE I WCALE NIE MUSISZ 
CZYTAC TEGO TEKSTU POPROSTU NIE WIDZIALEM SENSU PISANIE TEKSTU OD PODSTAW PRZECIESZ
		KTOS JUZ TO NAPISAL I ZROBIL TO BARDZO DOBRZE!!!

OK koniec marudzenia, A OTO MOJE WYPOCINY:

PS. Wisicie mi DUUUUZOOO pifka....

2.Potrzebne narzedzia

Sorrki ze bede opisywal tylko narzedzia pod WIN (choc sam pracuje pod LINUXem)
ale sila wyzsza, to ma kazdy.
a wiec:

- jakikolwiek edytor textowy (Notepad) byle by zapisywal TXT (pliki z rozszezeniem *.txt)
- kompilator asemblera:
	-Tasm (Turbo Asembler) nie musi byc caly pakiet wystarczy Tasm.exe ; Tlink.exe ;
	   rtm.exe, przydalo by sie tez Tasm32.exe;Tlink32.exe i biblioteke import32.lib
	- lub pakiet Visual Asembler (Bardzo Dobry).
- Rozpiske Api (pod Windowsika, jezeli chcemy pisac pod Win32)
- SofIce 4.05 lub nowszy
- Hiew 6.16 lub inny edytor HEX
- jakis disaseblator najlepiej: W32dsm 8.9
- CHECI !
- ROZUM !

Skad wziac te narzedzia, no najlepiej z sieci, podam kilka adresow:

http://www.republika.pl/zamczysko 	(moja osobista jest tam wszystko)
http://crackpl.site.pl
http://crackpltools.prv.pl

3.Systemy liczbowe

To jest niezbedne do pisania w ASM, a wiec wkuj to, musisz umiec zamieniac liczby
dziesietne na szesnastkowe lub dwojkowe w biegu..

Systemy dwjkowy i szesnastkowy s to najzwyklejsze w wiecie systemy liczenia 
tak samo jak dobrze wszystkim znany i powszechnie uywany system dziesitny.
Aby najprociej zobrazowa sposb dziaania systemw dwjkowego i szesnastkowego,
powinnimy zacz od przyjrzenia si systemowi dziesitnemu:

Wemy na przykad liczb 123 - w systemie dziesitnym.
Patrzc od prawej strony - pierwsza cyfra okrela ilo jednoci 
nastpna - ilo dziesitek i wreszcie trzecia od prawej - ilo setek.
Liczba 123 jest wic rwna:
			 1*100+2*10+3*1
			 matematycznie jest to 1*10^2+2*10^1+3*10^0

Podobnie sytuacja ma si z ukadem dwjkowym - tyle, e zamiast dziesiciu cyfr (0 .. 9)
mamy tu do dyspozycji tylko dwie - 0 i 1. 
Pierwsza cyfra od prawej strony okrela nam wic ilo jednoci, nastpna - ilo dwjek,
nastpna - ilo czwrek, semek, szesnastek itd. 

Jak wic zamieni na ukad dwjkowy liczb 67? 

			67 =1*64+0*32+0*16+0*8+0*4+1*2+1*1 =1000011 
			matematycznym jest to 1*2^0+1*2^1+0*2^2+0*2^3+0*2^4+0*2^5+1*2^6

Wreszcie trzecim ukadem, ktrym si zajmiemy, jest ukad szesnastkowy (hexadecymalny,
std symbol "H" dodawany do liczb w tym ukadzie). Pierwszy problem polega na tym, e
potrzebujemy 16 cyfr, aby mc zapisywa liczby w tym ukadzie - podczas, gdy istnieje
tylko 10 cyfr. Aby poradzi sobie z tym problemem, za cyfry 10-16 przyjto litery A do F,
zestaw cyfr w ukadzie szesnastkowym ma wic posta:

					   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

Caa reszta jest analogiczna jak w ukadzie dziesitnym i dwjkowym, tj. pierwsza od 
prawej cyfra okrela ilo jednoci, nastpna - szesnastek, nastpna - dwiecie 
pidziesitek szustek itd. 
Liczba 123D (decymalna - dziesitna - zapisana w ukadzie dziesitnym) - ma wic 
w ukadzie szesnastkowym posta: 

			7*16+11*1 =7B - cilej - 7BH - litera H na kocu informuje, 
							e liczba jest zapisana wanie 
							w ukadzie szesnastkowym.

Ostatnia kwestia dotyczy powszechnoci ukadu szesnastkowego w programowaniu.
Jak wiesz, najczciej spotykan jednostk informacji jest bajt (bit jest mniej 
praktyczny i rzadziej uywany) - czyli 8 bitw. Na omiu bitach, czyli w jednym bajcie 
mona zapisa 256 liczb (0 .. 255) - 2^8. To wanie ukad szesnastkowy umoliwia 
zapisanie tych liczb na dwch znakach - 16*2=256 - 0d=00H, 255D=FFH. 

4.Procesor

Procesor - zwany czsto CPU (od angielskiego "central processor unit")
jest gwnym urzdzeniem wchodzcym w skad systemu komputera.
To wanie procesor wykonuje kady program, odpowiada za komunikacj z urzdzeniami we/wy
i transfery pamici - sowem bez procesora komputer nie mgby wogle funkcjonowa bdc
tylko nieskoordynowanym splotem przewodw z rnych urzdze. 
Ten text objani po krtce jzyk, ktrym moemy rozkazywa procesorowi, terminologi,
ktr czsto spotyka si w dyskusjach i wreszcie poda kilka przykadw na spoytkowanie
nabytej wiedzy.

5.Porty

Okazuje si, e tak. To wanie i wycznie przez porty procesor komunikuje si ze
wszystkimi urzdzeniami - od drukarki, ekranu i klawiatury poprzez modem, cd-rom i 
kart muzyczn - na pamici cmos i wbudowanym zegarze czasu rzeczywistego (RTC) 
skoczywszy. 
Porty s adresowane 16-bitowo, tzn. kady port ma swj unikalny dwubajtowy adres w 
systemie - np. com1 - 03F8H, lpt1 - 0378H, klawiatura - 0060H do 0064H ITD. 

6.Rejestry

Rejestry sa podstawowym miejscem przechowywania danych. Sa to
16-bitowe komorki procesora. Jest 14 rejestrw i w tym 12 rejestrow
danych i adresowych, rejestr wskaznika instrukcji (IP) i rejestr
znacznikow. Rejestry danych i adresowych mozemy podzielic na kilka
grup i tak:

AX (akumulator)             --------+
BX (bazowy)                         |----- Rejestry oglnego
przenzaczenia
CX (licznik)                        |    
DX (danych)                 --------+

SP (wskaznik stosu)         --------+
BP (wskaznik bazy)                  |-----Rejestrywskaznikowe i
indeksowe
SI (index zrodla)                   |
DI (indeks przeznaczenia)   --------+

CS (programu)               --------+
DS (danych)                         |----- Rejstry segmentowe
SS (stosu)                          |
ES (dodatkowy)              --------+

IP (wskaznik instrukcji)
I Rejestr Znacznikow

Jak oczywiscie kazdy sie zorientowal przy pracy w Win32 rejestry
okreslane sa jak EAX, EAX itd, oznacza to ze sa to odpowiedniki
powyzszych rejestrow, tyle, ze 32-bitowe.

Chwila wyjasnienia z tymi bitami. Wezmy rejestr AX, ktoryjest 16
bitowy i dzieli sie na dwa podrejestry 8 bitowe AH i AL. Jak wiemy
8 bitow tworzy bajt, ktory przyjumuje wartosc od 0 do 255, czyli
rejestr AH i AL moze miec najwieksza wartosc FFh. Logicznie myslac
-:) rejestr 16 bitowy moze przyjac maksymalna wartosc FFFFh itd.
(32 bit EAX mam max FFFFFFFFh ups-:)). Chyba kazdy lapie co daja 32
bitowe rejestry i jak zwiekszaja sie mozliwosci.

Warto zapoznac sie z charakterystykami rejestrow, gdzyz kazdy ma
swoje wlasne konkretne zastowsowanie. Przegladajac kod programu
mozemy zauazyc pewne prawidlowosci, np.

EIP - debugujac pod SoftIce 32bit widzimy, ze rejestr ten wskazuje
na aktualny kod instrukcji i mozemy go uzyc np do zalozenia pulapki
na danej lini czyli bpx EIP lub dokladniej CS:EIP.

CS - wskazuje segment kodu, czyli jak mamy jakac linie kodu o
adresie np. 14F:04033232 to mozemy ja zapisac jako CS:04033232
poniewaz w rejestrze CS jest zachowana wartosc 014F.

DS - podobnie jak powyzej, zawiera adres segmentu dany, jezeli w
okienku danych pod SoftIce mamy jakis adres np. 0145:03055555 to DS
wskazuje segment 0145.

ESI i EDI sa wskaznikami danych np. do porownan tekstow itp. Wezmy
np. instrukcje porownywania w bibliotekach VB - reps cmpsw dla,
ktorych w w ds:esi i es:edi zawarte sa adresy tekstow (np. numerow
seryjnych) do porwnania. To samo tyczy sie wielu instrukcji
przesylania i porownnywania danych, gdzie przeznaczenie i cel
zawarte sa w rejesteach SI i DI np:

LEA SI, ZRODLo                      ;Zaladowanie adresu zrodla
LEA DI, ES:PRzesznaczenie           ;Zaladowanie adresu
przezanczenia

MOV CX,100                          ;Zaladowanie licznika elementow
MOVS Przeznaczenie,Zrodlo           ;Kopiowanie tekstu z jednego
miejsca w innne.

6a.Specyfikacja INTELA (rejestry)

 Rejestry ogolnego przeznaczenia          Rejestrysegmentowe
         AH/AL  AX  (EAX)  Akumulator             CS     Programu
         BH/BL  BX  (EBX)  Bazowy                 DS     Danych
         CH/CL  CX  (ECX)  Licznik                SS     Stosu
         DH/DL  DX  (EDX)  Danych                 ES     Dodatkowy
                                         
 
        (Exx) znaczy  386+ 32 bit rejestr   
 
         Rejestry wskaznikowe                    Rejestry stosu
 
         SI (ESI)  Indeks zrodla                 SP (ESP)  Wskaznik stosu
         DI (EDI)  Indeks przeznaczenia          BP (EBP)  Wskaznik bazy
         IP        Wskaznik instrukcji
 
         FLAGI Rejestr Znacznikow   (zobacz FLAGI)
 
         Specjalne rejestry (386+)
         CR0     Control Register 0        DR0    Debug Register 0 
         CR2     Control Register 2        DR1    Debug Register 1 
         CR3     Control Register 3        DR2    Debug Register 2 
                                           DR3    Debug Register 3
         TR4     Test Register 4           DR6    Debug Register 6
         TR5     Test Register 5           DR7    Debug Register 7
         TR6     Test Register 6
         TR7     Test Register 7

Rejestry ogolnego przeznaczenia sa przeznaczzone do przechowywania
dowolnych danych i wykonywania roznych operacji (arytmetycznych,
logicznych itp) , pelnia takze funkcje specjalne odpowiadajace ich
nazwom. 

AX (accumulator) - rejestr ten jest najczesciej uzywany przy
operacjach mnozenia i dzielenia, a takze w operacjach logicznych,
arytmetycznych i odkladania wynikow wielu operacji.
8 dolnych bitow tego rejstru okresla sie jako rejestr AL, a 8
gornych bitow jako AH 

BX (basis) - rejestr bazowy moze byc uzywany jako dwa 8-bitowe
rejestry BH i BL, a np. jako 16-bit mozemy go uzyc do utworzenia
adresu pamieci, tworzac z rejestrem segmentowym pelny adres -
Segmennt:Offset - DS:BX 

CX (count) - rejestr zliczajacy jest wykorzystywany oprocz
zliczania takze do przesylania danych. Moze byc takze uzywany jako
dwa rejestry 8-bitowe CH i CL.

DX (data) - rejestr danych wykorzystuje sie przy dzieleniu i
mnozeniu. Jest takze jedynym rejestrem, w korym mozna podac adres
portu w rozkazach wejscia-wyjscia. 

Rejestry segmentowe sluza do adresowania pamieci operacyjnej.  

CS (code segment) - rejestr wskazuje poczatek segmentu kodu
programu, tworzy pelny adres wraz z rejestrem IP - CS:IP. Rozkazy
programu, skoki, powroty pobierane sa w odniesieniu do tego
rejestru. 

DS (data segment)  - rejestr wskazujacy poczatek segmentu danych 

SS (stack segment) - rejestr stosu wskazuje poczatek segmentu stosu 

ES (extra segment) - rejestr dodatkowu wskazujacy dodatkowy segment
danych 

Rejestry wskaznikow. Dostep do danych adresowany jest przez
polaczenie adresu z rejestru segmentu z przesunieciem pobieranym z
innego rejestru min. rejestru wskaznikowego.

SI (source index) - rejestr indeksowy zrodla, najczesciej stosowany
przy adresowaniu w innstrukcjach przetwarzajacych lancuchy znakow,
tworzy wowczas pelny adres DS:SI   

DI (destination index) - rejestr indeksowy przeznaczenia, podobny
do SI uzywany w adresowaniu danych przy przetwarzaniu lancuchow
znakow, tworzy wowczas pelny adres ES:DI 

SP (stack pointer) - wskaznik stosu tworzy wraz z SS - SS:SP adres
danej odeslanej na stos i jest wykorzystywany przy pobieraniu i
zapisywaniu danych na stos. 

BP (base pointer) - wskaznik bazy uzywany jest podczas operacji
niestandardowych np. przy pobieraniu parametrow przekazywanych na
stos. 

IP (instruction pointer) - wskaznik instrukcji wskazuje na
aktualnie wykonywana instrukcje i wraz z rejestrem segmentu kodu
tworzy pelny adres - CS:IP. IP wskazuje offset (przesuniecie)
wzgledem poczatku segmentu programu. 

7.Flagi

Falgi sa komorkami, ktore moga przyjmowac wartosc 0 lub 1 i sa
zawarte w rejestrze znacznikow. Odpowiednie ustawienie
poszczegolnych flag decyduje o wykonaniu innych instrukcji a
szczegolnie instrukci warunkowych. Najszybciej zrozumiec flagi
mozna na przykladzie :

CMP AX,BX     - Porownaj rejestry AX z BX, jezeli rowne to flaga
zerowa Z ustawiona na 1
JZ 0401233    - Jezeli flaga Z ustawiona na 1 to wykonaj skok do
adrsu 0401233

Oczywiscie intrukcja CMP ustawia takze inne flagi z zaleznosci od
wyniku porownania i podobnie inne instrukcje warunkowych skokow
moga sprawdzac takze inne flagi. Szczegolowiej przedstawie to przy
omowieniu skokow warunkowych.

Po co nam znajomoasc flag, ano poto aby podzczas analizy kodu
wiedziec jaki wynik dalo porownanie danych i czy np. skok zostanie
wykonany czy nie. Poza tym debugujac program mozem zmienic
dzialanie instrukcji skoku zmieniajac stan znacznikow.

Np. w powyzszym przykladzie AX jest rowne BX i flaga zerowa Z
zostala ustawiona na 1 wiec skok warunkowy zostanie wykonany.
Jezeli jednak mimo rownosci AX i BX nie chcemy wykonac skoku to
podczas sledzenia programu resetujemy flage zerowa. W SoftIce
robimy to : r fl z (czyli resetuj flage zerowa) i skok nie zostanie
wykonany :-)

Ciekawostki :
Bit 6 rejestru znacznikow - znacznik zera, najwazniejsza przy
pierwszych krokach lamania programow. Decyduje o podstawowych
skoksach warunkowych :-)

Bit 8 rejestru znacznikow - flaga pracy krokowej (TF - trap flag)
ustawia procesor w trybie pracy krokowej w celu uruchomienia
programu pod debugerem,

Bit 10 rejestru znacznikow - flaga kierunku (DF - direction flag)
wymusza zwiekszania lub zmniejszanie rejestrow indeksowych przy
wykonywaniu instrukcji operujacych na lancuchach czyli albo rosnaco
albo malejaco (czyli od lewej do prawej albo na odwrot).

7a.Specyfikacja Intel (flagi)

Rejestr znacznikow jest 16-bitowym rejestrem, szesc bitow zawiera
informacje o stanach, trzy pozwalaja sterowac praca procesora z
poziomu programu a dwa pozostale zwiazane sa z trybem wirtualnym.
 

      |11|10|F|E|D|C|B|A|9|8|7|6|5|4|3|2|1|0|
        |  | | | | | | | | | | | | | | | | '---  CF Carry Flag
        |  | | | | | | | | | | | | | | | '---  1
        |  | | | | | | | | | | | | | | '---  PF Parity Flag
        |  | | | | | | | | | | | | | '---  0
        |  | | | | | | | | | | | | '---  AF Auxiliary Flag
        |  | | | | | | | | | | | '---  0
        |  | | | | | | | | | | '---  ZF Zero Flag
        |  | | | | | | | | | '---  SF Sign Flag
        |  | | | | | | | | '---  TF Trap Flag  (Single Step)
        |  | | | | | | | '---  IF Interrupt Flag
        |  | | | | | | '---  DF Direction Flag
        |  | | | | | '---  OF Overflow flag
        |  | | | '-----  IOPL I/O Privilege Level  (286+ only)
        |  | | '-----  NT Nested Task Flag  (286+ only)
        |  | '-----  0
        |  '-----  RF Resume Flag (386+ only)
        '------  VM  Virtual Mode Flag (386+ only)


Bit 0, (CARRY FALG) CF - Znacznik przeniesienia, ma wartosc 1 jesli
dodawanie powoduje przeniesienie lub odejmowanie powoduje
pozyczenie, w przeciwnym razie ma wartosc 0. CF zawiera takze
wartosc przesuniecia lu przesunietego cyklicznie bitu wychodzacego
poza rejestr lub komorke pamieci, oddaje takze wynik operacji
porownania. CF dziala takze jako wskaznik dla operacji mnozenia. 

Bit 2, (PARITY FLAG) - Znacznik parzystosci - ma wartosc 1 gdy
wynik operacji ma parzysta ilosc bitow o wartosci 1, w przeciwnym
wypadku znnacznik przyjmuje wartosc 0. PF jest glownie uzywany przy
przesylaniu danych.  

Bit 4, (AUXILIARY CARRY FLAG) - znacznik przeniesienia pomocniczego
- ma podobne znaczenie jak CF, ale pokazuje przeniesienie lub
pozuczke od bitu 3 w gore. AF jest uzyteczny przy dzialaniach na
"spakowanych" liczbach dziesietnych.  

Bit 6, (ZERO FLAG) - znacznik zera - ma wartosc 1 gdy wynik
operacji jest  zerem, wynik rozny od zera ustawia na 0 

Bit 7 - (SIGN FLAG) - znacznik znaku - ma znaczenie tylko podczas
operacji na liczbach ze znakiem, SF przyjmuje wartosc 1 jesli
wynikiem operacji arytmetycznych, logicznych, przesunniec jest
wartosc ujemna, w przeciwnym wypadku przyjmuje wartosc 0. Inaczej
mowiac SF pokazuje najbardziej znaczasy bot (bit znaku) wyniku,
niezaleznie czy wynik jest 8 czy 16-bitowy

Bit 8 - (TRAP FLAG) - znacznik pracy krokowej - ustawia procesor w
trybie pracy krokowej, w celu uruchomienia programu po debugerem.

Bit 9 - (INTERRUPT FLAG) - znacznik zezwolenia na przerwanie -
zezwala procesorowi rozpoznac zadanie obslugi przerwan pochodzace
od zewnetrznych urzadzen systemu. Wyzerownie IF powoduje, ze
procesor ignoruje przerwania. 

Bit 10 - (DIRECTORY FLAG) - znacznik kierunku - wymusza
zmniejszenie (DF=1) lub zwiekszenie (DF=0) rejestrow indeksowych po
wykoniu instrukcji operujacych na lancuchach. Jesli DF =0 to
procesor przetwarza lancuchy w kierunku rosnaczych adresow (od
strony lewej do prawej) a jak 1 to w kierunku odwrotnym.  

Bit 11 - (OVERFLOW FLAG) - znacznik nadmiaru - jest glownie
wskaznikiem bledu podczs operacji na liczbaczh ze znakiem.
OF=1 jesli dodanie dwoch liczb z jednakowym znakiem lub odjecie
dwoch liczb z roznymi znakami daje wynik nie mieszczacy sie w
argumencie wykonanej instrukcji, w przeciwnym przypadku znacznik
jest 0. OF ma takze wartosc 1 gdy najbardzej znaczacy bit (bit
znaku) argumentu zostanie zmieniony przez przesuniecie podczas
operacji arytmetycznej, w przeciwnym przypadku jest 0.
Znacznik OF, razem ze znacznikiem CF, wskazuje takze dlugosc wyniku
mnozenia. Jesli bardziej znaczaca czesc iloczynu jest rozna od zera
to OF i CF sa rowne 1, jezeli jest inaczej to oba znaczniki sa
rowne 0.
OF takze przyjmuje wartosc 1 gdy operacja z dzielenia daje iloraz
przekraczajacy rejestr przeznaczenia. 

8.Stos

Stos jest obszarem pamici uywanym do "tymczasowego" przechowywania danych istotnych dla
programu.Jak powiedzielimy w sekcji "Rejestry i flagi" rejestry s obszarem 
kilku(nasto)bajtowym i nie nadaj si raczej do przechowywania danych - raczej do ich 
obrbki.Funkcj magazynu peni wanie stos. 

Jak dziaa stos? 

Wyobra sobie kilka kartek - umownie ponumerowanych od 1 do 10 - symbolizujcych dane. 
Jeli na stole pooysz kartk o numerze 1, to masz ju jedn kartk "na stosie". Jeli 
na kartce 1 pooysz kartk 2, to wwczas masz na stosie ju dwie kartki. Do jeszcze 
kartki 3 i 4 - 4 kartki na stosie. Zauwa jednak, e w danym momencie masz dostp tylko 
do kartki 4 - tylko j moesz w danym momencie zdj ze stosu. Kartki 1 2 i 3 s dla ciebie
aktualnie niedostpne - aby mc zobaczy co jest na nich napisane musisz zdj kartk 
4, 3 i 2. Wniosek 1: ze stosu dane mog by pobierane w odwrotnej kolejnoci, ni zostay 
na nim umieszczone. Wniosek 2: W danym momencie masz dostp do ostatnio umieszczonego na 
stosie elementu - bez moliwoci natychmiastowego dostpu do elementw poprzednich.

Assembler - do obsugi stosu - posiada dwie analogiczne instrukcj 
	  - na_stos (push) 
	  - ze_stosu (pop)

Acha jeszcze jedno, na szczyt stosu wskazuje tzw. wskaznik stosu SP
(Stack Pointer) a instrukcje PUSH i POP zwiekszaja i zmniejszaja
ten wskaznik. Rejestr ten nigdy nie jest ustawiany bo procesor to
robi automatycznie i zawsze wskazuje adres szczytu stosu
(szczytowego slowa). 

Paczac ogolnie na pamiec komputera, kazda czesc programu moze
utworzyc swoja dowolna przestrzen stosu. Programista powinien tak
przydzielic pamiec aby stos nie pokrywal sie przypadkiem z innymi
obszarami pamieco :-)

9.Pamiec

Pami jest chyba drug co do wanoci skadow systemu komputera. 
To wanie tutaj znajduje si stos, wykonywany program i jego dane, system operacyjny
ze sterownikami - sowem wszystko, co aktualnie jest potrzebne do pracy komputera. 

Istniej 3 rodzaje pamici: RAM, ROM i pami zewntrzna. 

Pami zewntrzna- nie naley do pamici waciwej: jest to nonik, na ktrym mona 
dokona zapisu np. dyskietka, dysk twardy... 

Pami ROM (read only memory - tylko do odczytu) do ukad elektroniczny zawierajcy 
wszystkie procedury podstawowe komputera - np. biosu. Pami ta - jak wskazuje nazwa - nie
moe by modyfikowana przez uytkownika. 

Pami RAM (random access memory - pami o dostpie swobodnym) jest pamici, ktra
zawiera wszystkie skadowe, o ktrych pisaem na pocztku tj. program z danymi, system 
operacyjny i wszystkie sterowniki. Pami ta moe by dowolnie modyfikowana przez 
uytkownika, ale jej wad jest, e wszystkie zapisane informacje s z niej bezpowrotnie 
tracone w momencie odcicia dopywu prdu. 

Aby jednoznacznie okreli (zaadresowa) jakie miejsce w pamici, uywa si dwch 
dwubajtowych wartoci - segment i przesunicie (offset). Przesunicie jest liczb 
okrelajc odlego miejsca w pamici od pocztku segmentu - np. czwarty bajt pamici 
znajduje si w segmencie 0 na przesuniciu 4. 
Wartoci segment i offset s dwubajtowe, czyli maksymalna dugo kadego segmentu 
wynosi 65536 bajtw (64KB). 

Wana uwaga !!!

Wbrew temu, co mogoby si wydawa, nie prawd jest, e w pamici mona zaadresowa 
65536 segmentw *65536 bajtw czyli w sumie ponad 4 miliardy bajtw. Okazuje si bowiem, 
e pocztki segmentw w pamici s przesunite nastpny wzgledem obecnego o 
16 bajtw - tzn. zerowy bajt segmentu x jest jednoczenie szesnastym bajtem 
segmentu x-1 i trzydziestym drugim segmentu x-2... 
Dziki takiej organizacji minimalizowane s dziury midzy programami alokowanymi 
w pamici, ale sprawia to jednoczenie, e dugo adresowalnego w ten sposb obszaru 
wynosi 16*65536 czyli 1MB. 

10.Przerwania.

Przerwanie (ang. interrupt) jest sygnaem dla procesora mwicym mu, e ma czasowo 
przerwa aktualnie wykonywany proces i zaj si czym innym. Bez przerwa procesor 
musiaby stale kontrolowa wszystkie urzdzenia zewntrzne typu klawiatura, podczas gdy 
z przerwaniami procesor moe wykonywa jaki program i nadal ma moliwo reagowa na 
wydarzenie zewntrzne (np. nacinicie klawisza) od razu po jego wystpieniu. 

Procesor ma te instrukcj, ktra umoliwia wyczenie przerwa - jeli aktualnie 
wykonywany proces nie moe by zakcany. Istniej jednak pewne specyficzne sytuacje, 
podczas ktrych konieczna jest reakcja procesora - np. awaria sprztu, pamici czy 
odcicie dopywu prdu - nie wane jak istotny jest wykonywany aktualnie proces. 
Do poinformowania procesora o tych ekstremalnych wypadkach su tzw. non maskable 
interrupts (NMI - przerwania niemaskowalne). 

Procesor posiada 256 rnych przerwa - mona je podzieli na dwie grupy: 

1. Hardware interrupts - przerwania sprztowe - 
			omwione powyej przerwania wywoywane przez inne czci sprztu 
			jak np. klawiatura, zegar etc. 
2. Software interrupts - przerwania programowe -
			 przerwania, ktre s wywoywane przez program - np. 
			 przerwanie 21h - przerwanie dos'a - zajmiemy si tym pniej.

Rwnie w przypadku przerwa programowych, po napotkaniu odwoania do przerwania 
(instrukcja INT) - procesor przerywa wykonywanie aktualnego programu i "przeskakuje" do 
procedury wywoanego przerwania. 

No wanie: Kade z przerwa - bez wzgldu na to, czy jest to przerwanie programowe czy
sprztowe - posiada procedur obsugi - procedur, ktra jest wykonywana w momencie 
wystpienia danego przerwania - w przypadku przerwania klawiatury bdzie to odczytanie 
znaku i jego zapis do bufora klawiatury. Procedury obsugi danego przerwania mona 
oczywicie zmieni tak, eby procesor po wystpieniu przerwania wykonywa zamiast 
standardowej obsugi - np. cz naszego programu. Na tym wanie polega pisanie programw 
rezydentnych tzw. tsr'w. Po wykonaniu procedury obsugi danego przerwania procesor 
powraca do programu, ktry wykonywa przed wystpieniem sygnau przerwania i wykonuje ten 
program. 

Waniejsze przerwania to: 

1. Sprztowe: 
08H - zegar - przerwanie wykonywane 18.2 razy na sekund; 
09H - klawiatura - przerwanie wykonywane, gdy zosta nacinity lub puszczony 
      jakikolwiek klawisz. 
70H - RTC - zegar czasu rzeczywistego. 
(S to oczywicie tylko te przerwania, ktre nas - pocztkujcych assemblerowcw - bd 
interesowa jako te, ktre si przydaj:)). 

2. Przerwania programowe: 
05H - bios - print screen - przerwanie uaktywniane, gdy nacinity zostaje klawisz 
10H - bios obsuga karty graficznej 
16H - bios - obsuga klawiatury 
20H - dos - zakoczenie programu 
21H - dos - gwne przerwanie funkcji/procedur 


Ju na wstpie radzibym zaopatrzy si w mniej lub bardziej dokadny spis przerwa z 
opisem ich funkcji - jest to niezbdne, gdy nie sposb zapamita kilkuset rnych 
uytecznych funkcji. 
Kwesti przerwa a dokadniej - ich praktycznego uycia - zgbimy nieco pniej - 
podczas omawiania instrukcji int. 
 



11.Jak pisac w Turbo Asemblerze

11a.Uruchamianie programow w assemblerze(TASM) 

Bedziemy zajmowc sie tylko pakietem Tasm.
Pliki pisane w assemblerze moga miec wlasciwie dowolne rozszezenie, ale glownie nadaje sie je w 
postaci *.asm. Pliki takie przygotowywuje sie w dowolnym edytorze tekstu(ja czesto stosuje EDIT 
Windows Commandera, jesli chcemy stworzyc w WC nowy plik to nacisnij SHIFT+F4 i wpisz nazwe 
pliku). Gdy mamy gotowy plik *.asm to piszemy: 
tasm nazwapliku.asm 
wowczas otrzymujemy plik w przejsciowej postaci *.obj 
Teraz piszemy: 
tlink nazwapliku.obj 
Teraz otrzymujemy gotowy plik nazwapliku.exe 
Jesli mamy TASM 4.0 piszemy: ASM nazwapliku.asm 
i bez zbednych zabaw otrzymujemy plik nazwapliku.exe
Mozna tez napisac programik *.bat aby wykonywal to za nas:

edytujemu plik compile.bat i piszemy w nim:

tasm %1.asm
tlink %1.obj
del %1.obj

teraz wystarczy napisac 'compile <nazwa pliku bez rozszezenia>'


2.Ogolna skladnia assemblera(TASM) - PODSTAWY 

Ponizej omowie ogolna skladnie turbo assemblera. Bede tu bazowal na przykladzie ktorego 
celem bedzie wyswietlenie na ekranie rozkazem dosa(int 21h , ah = 09h ds:dx = adres tekstu 
zakonczony na $) napis "czesc". Na poczatek stworzymy plik typu *.exe . Na poczatku pliku
*.asm umieszczamy dyrektywe 'assume' po ktorej umieszczamy przypisanie danemu rejestrowi 
segmentowemu nazwy segmentu ktora zadeklarujemy dalej - chodzi tu o rozdzielenie danych 
i kodu. A wiec niech segment naszego kodu nazywa sie "code" a danych "dane" totez piszemy 
assume cs:code,ds:dane 
A wiec dalej deklarujemy segment danych: 
dane segment 
dane ends 
Dyrektywa ends oznacza koniec segmentu a segment jego poczatek 
Dalej trzeba umiescic w segmencie danych zmienna ktorej zawartosc wypiszemy: 
dane segment 
tekst db "Czesc$" 
dane ends 
Teraz definiujemy segment kodu wraz z odpowiednim kodem 
code segment 
start: ; etykieta informujaca o tym w ktorym miejscu zaczyna sie poczatek kodu 
mov ax,seg dane 
mov ds,ax ; inicjalizacja rejestru ds by wskazywal na nasze dane 
mov ah,09h 
mov dx,offset tekst 
int 21h 
mov ah,4Ch ; 4Ch rozkaz - zakoncz program 
int 21h 
code ends 
end start ; end - dyrektywa informujaca o koncu kodu 
Oto calkowita wersja: 
assume cs:code,ds:dane 
dane segment 
tekst db "Czesc$" 
dane ends 
code segment 
start: mov ax,seg dane 
mov ds,ax 
mov ah,09h 
mov dx,offset tekst 
int 21h 
mov ah,04Ch 
int 21h 
code ends 
end start 
Teraz majac plik tekstowy *.asm dokonujemy jego normalnej kompilacji przez 
TASM i TLINK poczym mozemy odpalic nasz gotoy plik *.exe. 

Troche inaczej mozna zmodyfikowac nasz program by umiescic dane w segmencie 
kodu i calkowicie pozbyc sie segmentu "dane". Totez w instrukcji assume 
rejestr ds musi wskazywac na segment kodu a wiec ten w ktorym bedziemy 
mieli umieszczone dane,czyli: 
assume cs:code,ds:code 
Teraz segment kodu bedzie wygladac tak ze na jego poczatku umieszcza sie dane 
(przed etykieta start - logiczne bo ta czesc nie zostanie wykonana), dalej po tej 
etykiecie umieszczamy kod z uwzlednieniem skopiowania zawartosci rejestru cs do ds 
bowiem przeciez rejestr kodu(cs) bedzie jednoczesnie rejestrem danych(ds) 
Gotowy taki program wyglada tak: 
assume cs:code,ds:code 
code segment 
tekst db "Czesc$" 
start: 
mov ax,cs 
mov ds,ax ; ds:=cs 
mov ah,09h 
mov dx,offset tekst 
int 21h 
mov ah,4Ch 
int 21h 
code ends 
end start 
Nalezy zeuwazyc, ze takie rozwiazanie ma sens w przypadku gdy dane i kod razem nie 
przekrocza 64kb(wielkosc jednego segmentu). 

Jesli chodzi o stworzenie pliku *.com to nalezy wiedziec, ze plik taki nie posiada zadnego naglowka 
bowiem jest czystym kodem programu bez zadnych informacji o nim jak jest to w przypadku 
pliku *.exe Cecha pliku *.com jest to, ze zawsze zaczyna sie od offsetu 100h(256h) 
zwgledem swego segmentu kodu stad tez w kodzie naszego programu znajdzie sie dyrektywa: 
org 100h 
Natomiast dane dla odmiany umiescimy na koncu segmentu pod rozkazem zakonczenia programu 
czyli 4Ch - wynika to z tad, ze ta czesc nigdy nie zostanie wykonana przez procesor. Stad 
otrzymamy taki kod: 
assume cs:code,ds:code 
code segment 
org 100h 
start: 
mov ax,cs 
mov ds,ax 
mov ah,09h 
mov dx,offset tekst 
int 21h 
mov ah,4Ch 
int 21h 
tekst db "Czesc$" 
code ends 
end start 
Nastepnie normalnie uzywamy polecenia TASM na naszym pliku z kodem, jednak kolejne 
polecenie TLINK nalezy uzyc z parametrem "/t", co oznacza wygenerowanie pliku *.com 
Mysle, ze powyzszy tekst troche ulatwil wam opanowanie podstaw assemblera. 

------------------------------------------------------------------------------------------

Dobra wystarczy tego jak na pierwsza czesc.
JAK NIE ROZUMIESZ CZEGOS TO CZYTAJ TO JESZCZE RAZ !!!!
a jak lapiesz o co biega to mozesz przejsc do 2 czesci

teksty zebrane z :
FAQ grupy CrackPL GustawKit via Mandylion
Kurs ASM autorstwa Grzegorza Zlotewicz
i moje teksty