Biblioteka Linux 64-bit.

W tym miejscu zadajemy pytania na temat języka Assembler, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
Awatar użytkownika
PROTON
Expert
Expert
Posty: 504
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Biblioteka Linux 64-bit.

Postautor: PROTON » środa 01 lut 2017, 13:57

Wrzucam swoją bibliotekę w wersji Linux 64-bit (NASM).
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

Gott weiß ich will kein Engel sein.

Wróć do „Pisanie programów w Assembler”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości