Wejście i wyjście z programu asemblerowego bywa uciążliwe.
Aby uprościć obsługę operacji wejścia/wyjścia, w programach asemblerowych można wywoływać funkcje C.
Uproszczony asemblerowy interfejs do funkcji printf i scanf został
zaimplementowany w bibliotece asm64_io. Parametry i wyniki przekazywane są do funcji przez rejestr RAX
a wywołania nie modyfikują żadnych innych rejestrów.
Pobierz bibliotekę asm64_io.zip (64bit, gcc wersja powyżej 5).
Repozytorium projektu na GitHubie
RAX
.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. Funkcje biblioteki asm64_io
Po załadowaniu do rejestru RAX
odpowiednich danych,
funkcje wykonuję się instrukcją call np.:
mov rax, 10
call print_int ; wypisze na ekran liczbę 10
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
%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
Najnowsza wersja biblioteki asm64_io pozwala ona na tworzenie oprogramowania i w wersji PIE i NO-PIE.
Starsza biblioteka asm_io była tworzona dla systemów 32 bitowych.