Wstęp do programowania w assemblerze po Linuxem

Zrozumienie poniższych programów wymaga znajomości rejestrów procesora oraz wywołań systemowych

Pierwsze programy

Program 32 bitowy

Listing 1. Asemblerowe "Hello world!"

; NASM 32 bit: program zapisany w pliku hello.asm

; kompilacja: nasm -felf hello.asm -o hello.o

; linkowanie: ld hello.o -o hello

; linkowanie w systemach 64-bit: ld -m elf_i386 hello.o -o hello

section .text ; początek sekcji z kodem

global _start ; linker ld domyślnie rozpoczyna wykonywanie

; programu od etykiety _start

_start: ; musi ona być widoczna na zewnątrz (global)

mov eax, 4 ; numer funkcji systemowej:

; 4= sys_write - zapisz do pliku

mov ebx, 1 ; numer pliku, do którego piszemy.

; 1 = standardowe wyjście = ekran

mov ecx, tekst ; ECX = adres (offset) tekstu

mov edx, dlugosc ; EDX = długość tekstu

int 80h ; wywołujemy funkcję systemową

mov eax, 1 ; numer funkcji systemowej

; (1=sys_exit - wyjdź z programu)

int 80h ; wywołujemy funkcję systemową

section .data ; początek sekcji danych.

tekst db "Czesc", 0ah ; nasz napis, który wyświetlimy

dlugosc equ $ - tekst ; długość napisu

Program 64 bitowy

Listing 2.

; wersja NASM na system 64-bitowy (x86-64)

; kompilacja: nasm -felf64 hello.asm -o hello.o

; linkowanie: ld hello.o -o hello

; linkowanie: ld -m elf_x86_64 hello.o -o hello

section .text ; początek sekcji kodu.

global _start ; linker ld domyślnie rozpoczyna

; wykonywanie programu od etykiety _start

; musi ona być widoczna na zewnątrz (global)

_start: ; punkt startu programu

mov rax, 1 ; numer funkcji systemowej:

; sys_write - zapisz do pliku

mov rdi, 1 ; numer pliku, do którego piszemy.

; 1 = standardowe wyjście = ekran

mov rsi, tekst ; RSI = adres (offset) tekstu

mov rdx, dlugosc ; RDX = długość tekstu

syscall ; wywołujemy funkcję systemową

mov rax, 60 ; numer funkcji systemowej

; (sys_exit - wyjdź z programu)

syscall ; wywołujemy funkcję systemową

section .data ; początek sekcji danych.

tekst db "Czesc", 0ah ; nasz napis, który wyświetlimy

dlugosc equ $ - tekst ; długość napisu

Zadanie 1

Skompiluj przykładowe przykłady, zmodyfikuj je w ten sposób aby pytały o imię, wczytywały je z klawiatury a następnie wypisywały spersonalizowane przywitanie.

Zadanie 2

Napisz program, który wczyta dwie liczby (jedno cyfrowe) doda je do siebie i wyświetli wynik.

Zadanie 3

Napisz program który otwiera plik do zapisu (jeżeli go nie ma to go tworzy) i wpisuje do niego tekst np. Twoje imię i nazwisko a następnie go zamyka.

Zadanie 4

Napisz program, który odczyta czas systemowy i wypisze aktualna godzinę. (Możesz wykorzystać wywołanie systemowe 13 lub 96).

Wskazówki:

  • Jako wynik wywołania systemowego otrzymujemy liczbę sekund od 1 stycznia 1970.

  • Reszta z dzielenia przez 10 da nam cyfrę jedności liczby sekund, następnie dzielenie przez 6 da nam cyfrę dziesiątek liczby sekund itd.

    • Przed każdym dzieleniem należy wyzerować EDX/RDX

    • Wygodnie jest przygotować sobie tekst typu

    • db "XX:XX:XX", 0ah

    • i uzupełnić miejsca X odpowiednimi cyframi.