Biblioteka Linux 64-bit.
: środa 01 lut 2017, 13:57
Wrzucam swoją bibliotekę w wersji Linux 64-bit (NASM).
Może kogoś zachęci do zabawy Assemblerem.
Może kogoś zachęci do zabawy Assemblerem.
Kod: Zaznacz cały
;BIBLIOTEKA NASM
;****************************************************
;kompilacja
;nasm -f elf64 libmk.asm
;****************************************************
;
;jeśli w kodzie chcemy użyć funkcji biblitecznej, wpisujemy na początku:
;extern _wypisz_rax_hex
;a w miejscu wywołania:
;call _wypisz_rax_hex
;podczas linkowania dołączamy bibliotkę:
;ld -s -o <program> <program>.o ./lib/libmk.o
;
;****************************************************
;wypisanie rejestru rax na ekran szesnastowo
global _wypisz_rax_hex
;wypisanie rejestru rax na ekran dziesiętnie
global _wypisz_rax_dec
;wypisanie rejestru rax na ekran binarnie
global _wypisz_rax_bin64
;nowa linia
global _nowa_linia
;pobieranie tekstu
global _pobierz_txt
;pobieranie liczby
global _pobierz_liczbe_rax
;wyjscie
global _wyjscie_z_programu
section .text
_wypisz_rax_hex:
pushfq
push rax
push rbx
push rsi
_wypisz_rax_hex_petla:
xor rbx,rbx
mov bl,al
and bl,0fh
cmp bl,9
ja _znak_hex
or bl, "0"
jmp short _znak_bufor
_znak_hex:
add bl, "A"-10
_znak_bufor:
mov [bufor+rsi], bl
shr rax, 4
inc rsi
test rax, rax
jnz _wypisz_rax_hex_petla
_wypisz_rax_hex_wypis:
mov al,[bufor+rsi-1]
call _wypisz_znak
dec rsi
jnz _wypisz_rax_hex_wypis
pop rsi
pop rbx
pop rax
popfq
ret
_wypisz_rax_dec:
pushfq
push rax
push rcx
push rdx
push rsi
xor rsi, rsi
mov ecx, 10
_wypisz_rax_dec_petla:
xor rdx, rdx
div ecx
or dl, "0"
mov [bufor+rsi], dl
inc rsi
test rax, rax
jnz _wypisz_rax_dec_petla
_wypisz_rax_dec_wypis:
mov al,[bufor+esi-1]
call _wypisz_znak
dec esi
jnz _wypisz_rax_dec_wypis
pop rsi
pop rdx
pop rcx
pop rax
popfq
ret
_wypisz_rax_bin64:
pushfq
push rax
push rbx
push rsi
push rdi
push rdx
xor rbx,rbx
xor rsi,rsi
_wypisz_rax_bin64_petla:
mov bl,"0"
shl rax,1
adc bl, 0
mov [bufor+rsi], bl
inc rsi
cmp rsi, 64
jl _wypisz_rax_bin64_petla
mov rax, 1
mov rdi, 1
lea rsi, [bufor]
mov rdx, 64
syscall
pop rdx
pop rdi
pop rsi
pop rbx
pop rax
popfq
ret
; nowa linia
_nowa_linia:
push rax
mov al, 0ah
call _wypisz_znak
pop rax
ret
; wypisuje znak ASCII z rejestru al
_wypisz_znak:
push rax
push rdi
push rsi
push rdx
mov [znak], al
mov rax, 1
mov rdi, 1
lea rsi, [znak]
mov rdx, 1
syscall
pop rdx
pop rsi
pop rdi
pop rax
ret
;TODO
;pobieranie tekstu
_pobierz_txt:
push rax
push rdi
push rsi
push rdx
mov rax, 0 ;0 - sys_read
mov rdi, 1 ;fd
lea rsi, [bufor]
mov rdx, 64
syscall ;w buforze znajdune sie tekst a w rax dlugosc tekstu
pop rdx
pop rsi
pop rdi
pop rax
ret
;TODO
;pobieranie liczby rax
_pobierz_liczbe_rax:
pushfq
push rdi
push rsi
push rbx
push rcx
push rdx
mov rax, 0 ;0 - sys_read
mov rdi, 1 ;fd
lea rsi, [bufor]
mov rdx, 64
syscall ;w buforze znajdune sie tekst a w rax dlugosc tekstu
mov rdx, rax ;rdx - ilośc cyfr w buforze
xor rcx, rcx ;rcx - ilośc cyfr przetworzona
xor rax, rax ;rax - wynuik
_pobierz_liczbe_rax_oblicz:
;obliczenia
imul rax, 10 ;rax = rax * 10
mov rbx,[bufor+rcx]
sub rbx, "0"
cmp rbx, 9
jg _blad_danych
add rax, rbx
inc rcx
cmp rdx, rcx
jne _pobierz_liczbe_rax_oblicz
pop rdx
pop rcx
pop rbx
pop rsi
pop rdi
popfq
ret
_blad_danych:
pop rdx
pop rcx
pop rbx
pop rsi
pop rdi
popfq
xor rax, rax
stc
ret
;wyjscie z programu
_wyjscie_z_programu:
mov rax, 60
syscall
;####################################################
section .data
bufor times 64 db 0
znak db 0