Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

4. Kurs Asembler x86: Pierwszy program, podstawy debugera


Rekomendowane odpowiedzi

Opublikowano

Link do bloga, widać obrazki i sformatowany kod: http://zostanprogramista.blogspot.com/2016/02/4-kurs-asembler-x86-pierwszy-program.html

 

Tekst artykułu:

 

 

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

1.png
 
Skompiluj program Build > Build Assembly
2.png
 
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
3.png
 
Kliknij Debug > Windows > Registers
Ta opcja otworzy okno, w którym będzie widocznaa zawartość rejestrów
4.png
 
 
Widoczona zawartość rejestrów.
5.png
 
 
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.
6.png
 
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.
7.png
 
 
Sytuacja po kolejnym naciśnięciu klawisza F10. Wykonana została instrukcja add eax, 11 a procesor czeka na wykonanie instrukcji invoke ExitProcess, eax.
8.png
 
Wartość rejestrów. Jak widać w rejestrze jest szesnastkowa wartość 10 czyli 16. Suma działania 5 + 11.
9.png
 
 
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

 

 

RAsfepN.png

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...