Biblioteka asm64_io

Wejście i wyjście z programu asemblerowego są, łagodnie rzecz ujmując, uciążliwe. Aby uprościć obsługę operacji wejścia/wyjścia, w programach asemblerowych można wywoływać funkcje C. Asemblerowy interfejs do funkcji printf i scanf został zaimplementowany w bibliotece asm64_io.

Strona projektu asm64_io na GitHubie.

Funkcje biblioteki asm64_io

Funkcja opis
print_int Drukuje na ekran wartość całkowitą z rejestru EAX
print_char Drukuje na ekran znak, którego kod ASCII jest w rejestrze AL
print_string Drukuje napis, którego adres znajduje się w EAX. Napis musi się kończyć zerem (typ C).
print_nl Nowa linia
read_int Czyta z klawiatury liczbę całkowitą i wrzuca do rejestru EAX
read_char Czyta znak z klawiatury i wrzuca jego kod ASCII do EAX
println_int
println_char
println_string
(tylko asm64_io) drukuje na ekran dodatkowo przechodząc do nowej linii.
dump_regs X Wypisanie zawartości rejestrów i flag. Liczba całkowita X jest etykietą.

Tabela 2. Funkcje biblioteki asm64_io

Po załadowaniu do rejestrów odpowiednich danych, procedury z Tabeli 2 woła się instrukcją call np.:

mov rax, 10
call print_int     ; wypisze na ekran liczbę 10

Stosowanie biblioteki

Zastosowanie biblioteki asm64_io wymaga pobrania jednej wersji poniżej. Z zawartych w niej plików modyfikujemy tylko plik starter.asm.

starter.asm

%include "asm64_io.inc"    ;odpowiednik dyrektywy #include z C

segment .data
;
; dane zainicjalizowane
;

segment .bss
;
; dane niezainicjalizowane
;

segment .text
global MAIN
MAIN:
enter 0,0         ; setup 

; ----
; Właściwy kod wstawiamy tu. 
; Nie należy modyfikować kodu przed i po tym komentarzu
; ---

mov eax, 0 ; kod zwracany z funkcji
leave
ret

Najpierw należy zbudować bibliotekę asm64_io.asm (wystarczy zrobić to tylko raz)

nasm -f elf64 asm64_io.asm -o asm64_io.o

Następnie kompilujemy własny program starter.asm i linkujemy go z biblioteką

nasm -felf64 -o starter.o starter.asm
gcc -o starter starter.o asm64_io.o 

Można też skorzystać z załączonego pliku Makefile i wywołać polecenie make

Przykład

%include "asm64_io.inc"
segment .data
pytanie db "Podaj dwie liczby : ", 0  ; tekst musi kończyć się zerem
wynik   db "Suma = ", 0

segment .bss
segment .text
global MAIN
MAIN:
enter 0,0
; ----

dump_regs 1     ; pierwsze wypisanie zawartości rejestrów

mov rax, pytanie
call print_string

call read_int   ; wczytanie liczby int
mov ebx, eax

call read_int   ; wczytanie drugiej liczby
cmp eax, ebx

dump_regs 2     ; drugie wypisanie zawartości rejestrów
call print_nl

add eax, ebx
call println_int  ; wypisanie liczby int z rax

call print_nl
; ---

mov rax, 0 ; powrót do C
leave
ret

Wersje biblioteki

Najnowszą wesja biblioteki asm64_io pozwala na tworzenie oprogramowania i w wersji PIE i NO-PIE.

Biblioteka asm_io była tworzona dla systemów 32 bitowych.

Alternatywą dla tej biblioteki jest biblioteka io zawarta w środkowisku SASM.