Start Og³oszenia Download Linki Szukaj Mapa strony

Programowanie

PHP
Delphi
Assembler
Visual Basic
_________________________
Dodaj w³asny artyku³
Google
Start arrow Assembler arrow Wstêp do assemblera
Wstêp do assemblera PDF Drukuj Email
Wpisa³: GustawKit   
16.07.2007.

Rejestry [REGISTERS] - #1

Rejestry sa podstawowym miejscem przechowywania danych. Sa to 16-bitowe komorki procesora. Jest 14 rejestrów 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 ogólnego 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.

[Specyfikacja architektury Intela - Rejestry]

Rejestry ogolnego przeznaczenia          Rejestry segmentowe
AH/AL AX (EAX) Akumulator CS Programu
BH/BL BX (EBX) Bazowy DS Danych
H/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

TR4 Test Register 4 DR3 Debug Register 3
TR5 Test Register 5 DR6 Debug Register 6
TR6 Test Register 6 DR7 Debug Register 7
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.

 

 

Flagi [FLAGS] - #2

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 :-)

 

|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)


 

Stos [STACK] - #3

Stos jest miejscem przechowywania danych jak rejestry lub zawartosci komorek pamieci. Mamy dwie instrukcje PUSH, ktora przesyla dane na szczyt stosu i POP, ktora pobiera dane ze szczytu stosu. O co biega z tymi szczytami :-), stos jest sterta na ktorej ukladane sa dane, kazda dana ukladana jest na szczyt a poprzednia dana schodzi na dalsza pozycje. Czyli istotna jest kolejnosc kladzenia danych na stos, gdyz w takiej samej( a dokladnie odwrotnej) kolejnosci musimy pobierac dane ze stosu:

PUSH EAX - kladzie na szczyt stosu EAX
PUSH EBX - kladzie na szczyt stosu EBX a EAX schodzi na dalsza pozycje
....instrukcje
POP EBX - pobiera ze szczytu dana ktora jest EBX ( a na szczycie zostaje EAX)
POP EAX - pobiera ze szczytu stosu EAX

Chyba lapiecie o co biega ?:-)

Acha jeszcze jedno, na szczyt stosu wskazuje tzw. wskaznik stosu SP (Stack Pointer) a instrukcje PUSH i POP zwiekszaja i zmniejszaja ten wskaznik.

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 :-)

 

CALL i RET - #3

CALL adres wywoluje funkcje o podanym adresie i wykonuje ja az do powrotu (RET).

instrukcje...
CALL 040ABCCC
Mov eax,edx
instrukcje...

Wywollanie CALL wywola funkcje o adrsie 040ABCCC i po powrocie z niej (RET) program bedzie kontynuowal dalej MOV eax,edx itd. Jak to sie dzieje, ze program wie gdzie ma wrocic ?. Ano CALL kladzie adres kodu na stosie, natomiast RET pobiera ten adres i wraca tam gdzie potrzeba.

Jezeli CALL wywoluje jakies funkcje, to argumenty takiej funkcji kladziemy na stosie przed wywolanie CALL. Przyklad takiego dzialania :

MOV EDI,[ESP+00000220]Zapisuje uchwyt okienka dialogowego w EDI
PUSH 00000100 Maksymalny rozmiar tekstu na stos
PUSH 00406130 Adres bufora dla tekstu na stos
PUSH 00000405 Identyfikator na stos
PUSH EDI Uchwyt okienka dialogowego na stos
CALL GetWindowText Wywolanie funkcji o parametrach zapisanych na stosie.

Widzimy wiec, ze przy jakis ciekawych wywolania funkcji warto zagladnac jakie parametry kladzione sa na stosie i ogolnie warto sie zorientowac jakie parametry dana funkcja wymaga.

 

MOV instrukcja przeniesienia - #3

To najczesciej spotykana instrukcja umozliwiajaca przenoszenie danych pomiedzy rejestrem a komorka lub pomiedzy rejestrami lub kopiowania stalej wartosci do rejestru lub komorki. Ogolna postac to MOV przeznaczenie, zrodlo i nie powinno nikomu sprawic klopotu jej zrozumienie.

Przyklady :
MOV EDS, EAX - przeniesienie pomiedzy dwoma rejestrami 32-bitowymi
MOV CL, 39 - przeniesienie stalej do rejestru
MOv ES:[BX],AX - zmiana przypisania segmentu

Kila uwag :

1. Nie mozna bezposrednio przeniesc danych pomiedzy komorkami pamieci. Musimy dane najpier przeniesc dane do rejestru ogolnego przeznaczenia a pozniej z rejestru do przeznaczenia w pamieci. Przyklad, mamy dwie zmienne w pamieci np. TYLEK i ZADEK i aby przenies wartosc z jednej do drugiej to

MOV AX,TYLEK
MOV ZADEK,AX

2. Nie mozna zaladowac bezposrednio stalej do rejestru segmentu, musimy ja przenies przez rejestr ogolnego przeznaczenia.

MOV AX, ADRES_DS
MOV DS, AX

3. Podobnie nie mozemy przenies bezposrednio zawartosci jednego rejestru segmentu do drugiego, podobnie musimy przez rejestr ogolnego przeznaczenia.

MOV AX, ES
MOV DS, AX

4. Nie mozna uzyc rejestru CS jaki argumentu przeznaczenia w instrukcji MOV

Widzicie wiec jakie kombinacje nalezy wykonywac z danymi i dlaczego az tak duzo instrukcji MOV mamy w kodzie programu.

Przy debugowaniu programu pamietajcie, ze w rejestrze moze byc szukana przez nas wartosc lub adres wskazujacy na ta szukana wartosc. A wiec sprawdzajac w SOFTICE dane jezeli uzyjemy komendy np. d EAX to wyswietli nam w oknie danych zawartosc pamieci o adresie zawartym w EAX, natomiast jak damy ? EAX to wyswietli nam dane zawarte w EAX w postaci szesnastkowej i dziesietnej.

 

MOV instrukcja przeniesienia - #3

To najczesciej spotykana instrukcja umozliwiajaca przenoszenie danych pomiedzy rejestrem a komorka lub pomiedzy rejestrami lub kopiowania stalej wartosci do rejestru lub komorki. Ogolna postac to MOV przeznaczenie, zrodlo i nie powinno nikomu sprawic klopotu jej zrozumienie.

Przyklady :
MOV EDS, EAX - przeniesienie pomiedzy dwoma rejestrami 32-bitowymi
MOV CL, 39 - przeniesienie stalej do rejestru
MOv ES:[BX],AX - zmiana przypisania segmentu

Kila uwag :

1. Nie mozna bezposrednio przeniesc danych pomiedzy komorkami pamieci. Musimy dane najpier przeniesc dane do rejestru ogolnego przeznaczenia a pozniej z rejestru do przeznaczenia w pamieci. Przyklad, mamy dwie zmienne w pamieci np. TYLEK i ZADEK i aby przenies wartosc z jednej do drugiej to

MOV AX,TYLEK
MOV ZADEK,AX

2. Nie mozna zaladowac bezposrednio stalej do rejestru segmentu, musimy ja przenies przez rejestr ogolnego przeznaczenia.

MOV AX, ADRES_DS
MOV DS, AX

3. Podobnie nie mozemy przenies bezposrednio zawartosci jednego rejestru segmentu do drugiego, podobnie musimy przez rejestr ogolnego przeznaczenia.

MOV AX, ES
MOV DS, AX

4. Nie mozna uzyc rejestru CS jaki argumentu przeznaczenia w instrukcji MOV

Widzicie wiec jakie kombinacje nalezy wykonywac z danymi i dlaczego az tak duzo instrukcji MOV mamy w kodzie programu.

Przy debugowaniu programu pamietajcie, ze w rejestrze moze byc szukana przez nas wartosc lub adres wskazujacy na ta szukana wartosc. A wiec sprawdzajac w SOFTICE dane jezeli uzyjemy komendy np. d EAX to wyswietli nam w oknie danych zawartosc pamieci o adresie zawartym w EAX, natomiast jak damy ? EAX to wyswietli nam dane zawarte w EAX w postaci szesnastkowej i dziesietnej.


@CrackPL by GustawKit


 

Komentarze
 
Napisz komentarz
  • Prosimy o komentarze odpowiadaj±ce tematowi artyku³u.
  • Personalne odniesienia do autorów artyku³u i innych komentarzy bêd± usuwane.
  • Prosimy nie dodawaæ w komentarzach odno¶nikow do swoich stron WWW.
Imiê:Go¶æ
Tytu³:
BBCode:Adres www Adres e-mail Wczytaj obraz Pogrubiony Pochylony Podkreslony Cytat Kod Rozpocznij listê Element listy Zamknij listê
Komentarz:



 
 

Powered by AkoComment 2.01 PL+
Polska adaptacja - © Copyright 2006 by Zwiastun

Zmieniony ( 10.08.2007. )
 
« poprzedni artyku³
home contact search contact search