Pierwszy program w assemblerze

Assembler jest językiem programowania niskiego poziomu, który umożliwia bezpośrednią interakcję z architekturą komputerową. Programowanie w assemblerze pozwala na pełną kontrolę nad sprzętem, co jest niezbędne w wielu zastosowaniach systemowych i wbudowanych. W tej lekcji przedstawimy najprostszy program w assemblerze, który demonstruje podstawy składni i działania programów na tym poziomie. Przykład zostanie przedstawiony dla architektury x86, jednej z najbardziej rozpowszechnionych architektur procesorów.

Najprostszy program: Wyświetlanie tekstu

W poniższym przykładzie zaprezentujemy program, który wyświetla na ekranie tekst “Hello, World!”.

section .data
    helloMsg db 'Hello, World!', 0 ; Zdefiniowanie ciągu znaków zakończonego zerem

section .text
    global _start

_start:
    ; Wyświetlenie wiadomości na ekranie
    mov eax, 4            ; Numer systemowy sys_write
    mov ebx, 1            ; Deskryptor pliku (1 - stdout)
    mov ecx, helloMsg     ; Wskaźnik do ciągu znaków
    mov edx, 13           ; Długość ciągu znaków
    int 0x80              ; Wywołanie przerwania

    ; Zakończenie programu
    mov eax, 1            ; Numer systemowy sys_exit
    xor ebx, ebx          ; Kod wyjścia (0)
    int 0x80              ; Wywołanie przerwania

Sekcje programu

  • section .data: Ta sekcja jest przeznaczona na zmienne i stałe, które nie zmieniają swojej wartości podczas wykonania programu. Tutaj zdefiniowany ciąg znaków helloMsg to statycznie alokowana tablica znaków, która zawiera tekst “Hello, World!” zakończony bajtem 0. Bajt 0 jest konwencjonalnym oznaczeniem końca ciągu w wielu środowiskach programistycznych, w tym w C i w assemblerze.

Instrukcje i rejestry

  • mov: Instrukcja mov służy do przypisywania wartości do rejestrów lub pamięci. W kontekście naszego programu, jest używana do ustawienia odpowiednich wartości przed wykonaniem systemowego wywołania.
  • eax: Ten rejestr jest wykorzystywany do przechowywania numeru wywołania systemowego. Dla sys_write jest to 4, a dla sys_exit1.
  • ebx: W przypadku sys_write, ebx przechowuje deskryptor pliku, przez który chcemy coś wysłać. Wartość 1 oznacza standardowe wyjście, czyli konsolę/terminal. Dla sys_exit, ebx przechowuje kod wyjścia programu, tutaj zerowany przez instrukcję xor ebx, ebx, co oznacza zakończenie programu bez błędów.
  • ecx: Rejestr ten przechowuje adres ciągu znaków do wyświetlenia przez sys_write. W naszym programie, jest to adres etykiety helloMsg.
  • edx: W kontekście wywołania sys_write, edx przechowuje długość ciągu znaków do wyświetlenia. W naszym przypadku jest to 13, co odpowiada długości ciągu “Hello, World!”.
  • int 0x80: Jest to instrukcja przerwania, która realizuje wywołanie systemowe w architekturze x86 dla systemów uniksowych, takich jak Linux. Dzięki niej kontrola jest przekazywana do jądra systemu, które wykonuje żądaną operację.

Wywołania systemowe

  • sys_write: Jest to wywołanie systemowe umożliwiające zapis danych do określonego deskryptora pliku. W naszym przykładzie używamy go do wypisania ciągu znaków na standardowe wyjście.
  • sys_exit: To wywołanie systemowe służy do zakończenia procesu. Kod wyjścia przekazany jako argument (w naszym przypadku 0) jest zwracany do systemu operacyjnego jako status zakończenia programu.

Podsumowanie

Program w assemblerze, choć wydaje się skomplikowany, składa się z prostych instrukcji wykonujących precyzyjnie określone zadania. Manipulacja rejestrami i wykorzystanie wywołań systemowych pozwalają na bezpośrednią interakcję z systemem operacyjnym i sprzętem komputerowym. Zrozumienie roli poszczególnych rejestrów i instrukcji jest kluczowe dla efektywnego programowania w assemblerze.

 

 

 

 

Scroll to Top