Łączna liczba wyświetleń

wtorek, 23 lutego 2016

4. Kurs Asembler x86: Pierwszy program, podstawy debugera

Autor Nauka Programowania  |  w visual studio  19:09

Uruchom Visual Studio i kliknij Open project. Wybierz wcześniej utworzy projekt, jest on skonfigurowany do tworzenia programu w assembly.


Skompiluj program Build > Build Assembly

Naciśnij F10. Program uruchomi się w debugerze i zatrzyma na pierwszej linijce wykonywalnego kodu. Instrukcja, która zostanie wykonana jako nastepna oznaczana jest przez strzałkę.
mov eax, 5

Kliknij Debug > Windows > Registers
Ta opcja otworzy okno, w którym będzie widocznaa zawartość rejestrów


Widoczona zawartość rejestrów.


Naciśnij F10, procesor wykona instrukcję, która była wcześniej oznaczona strzałką i będzie czekał na wykonanie kolejnej oznaczonej strzałką.
Została wykonana instrukcja mov eax, 5 Instrukcja add eax, 11 czeka na wykonanie.

W oknie Registers widać, że do rejestru EAX przeniesiona została wartość 5. Zmieniona została również wartość rejestru EIP i wskazuje on teraz na adres kolejnej instrukcji.


Sytuacja po kolejnym naciśnięciu klawisza F10. Wykonana została instrukcja add eax, 11 a procesor czeka na wykonanie instrukcji invoke ExitProcess, eax.

Wartość rejestrów. Jak widać w rejestrze jest szesnastkowa wartość 10 czyli 16. Suma działania 5 + 11.


Po kolejnym naciśnięciu F10 program się zamyka. Została wywołana funkcja ExitProcess z biblioteki kernel32.

Omówienie kodu

1: .386
2: .model flat, stdcall
3: .stack 4096
4:
5: include kernel32.inc
6: includelib kernel32.lib
7:
8: .data
9:
10: .code
11: main PROC
12:    mov eax, 5
13:    add eax, 11
14:    invoke ExitProcess, eax
15: main ENDP
16: END main


Linia 1: Jest to dyrektywa asemblera, nie przekłada się bezpośrednio na jakiś fragment kodu w programie. Informuje ona asembler żeby użył przy tłumaczeniu programu instrukcji procesora Intel 80386
Linia 2: To kolejna dyrektywa asemblera i określa model pamięci typu flat. W tym modelu pamięć jest dla programu jedną liniową przestrzenią adresową. Stdcall jest to informacja o wykorzystywanej konwencji wywołań funkcji. Ta konwencja oznacza, że stos jest czyszczony przez funkcję wywoływaną.
Linia 3: To polecenie mówi asemblerowi ile bajtów stosu zarezerwować. 4096 odpowiada wielkością jednej stronie pamięci w MMU. Większość programów korzysta ze stosu podczas wywoływania funkcji, służy on do przechowywania parametrów funkcji i przechowuje adres powrotu z funkcji.
Linia 5 i 6: Informują one asembler jaki nagłówek i jaką bibliotekę dodać do programu.
Linia 8: Określa sekcję programu, w której zostaną umieszczone zmienne.
Linia 10: Określa początek kodu programu.
Linia 11: Deklaracja funkcji main będącej punktem startowym programu.
Linia 12: Instrukcja MOV przenosi do rejestru EAX wartość 5
Linia 13: Instrukcja  ADD do zawartości rejestru EAX dodaje wartość 11
Linia 14: Wywołuje funkcję ExitProcess z parametrem eax
Linia 15: Określa koniec funkcji main
Linia 16: Określa koniec kodu wykonywalnego programu i odwołuje się do nazwy funkcji będącej punktem startowym programu


3 komentarze:

  1. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  2. Ja niestety programowaniem się nie zajmuję, ale bardzo chętnie używam różnego rodzaju systemów informatycznych. Fajnie, że z firmy https://www.connecto.pl/ mam możliwość wdrożenia właśnie takich aplikacji również u siebie.

    OdpowiedzUsuń
  3. Nie znam się na programowaniu, dlatego korzystam z gotowych rozwiązań, oferowanych przez sprawdzone firmy. Jednym z takich systemów jest na pewno Ready_™ Doskonałe, gotowe narzędzie do pracy.

    OdpowiedzUsuń

Proudly Powered by Blogger.