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
Ten komentarz został usunięty przez autora.
OdpowiedzUsuń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ń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ń