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.