BITS 64 GLOBAL sstatus:data 4, mode:data 4 GLOBAL store:function, top_length:function, retrieve:function, count:function EXTERN malloc, printf, strncpy, free, memcpy, strlen, _GLOBAL_OFFSET_TABLE_ ; void* malloc (size_t size); ; void free( void * ptr ); ; void *memcpy ( void * destination, const void * source, size_t num ); ; size_t strlen(const char *str) init: push rcx push rdi push rax push rbx push rdx push rsi mov rcx, 0x1 mov [rel bool], rcx mov rdi, 0x18 mov rax, 0x0 call malloc WRT ..plt mov [rel HEAD], rax; wskaznik do pamieci gdzie HEAD mov rdi, 0x18 mov rax, 0x0 call malloc WRT ..plt mov [rel TAIL], rax; wskaznik do pamieci gdzie TAIL mov rbx, [rel HEAD] mov rdx, [rel TAIL] mov rcx, 0x0 mov [rbx], rcx mov [rdx], rcx mov [rbx + 8], rdx mov [rdx + 8], rcx mov [rbx + 16], rcx mov [rdx + 16], rbx ;mov rdi, text ;mov rax, 0 ;call printf WRT ..plt pop rsi pop rdx pop rbx pop rax pop rdi pop rcx ret store: mov r8, [rel bool] cmp r8, 0x1 je jump call init jump: cmp rsi, 0 je jestNULL2 ; jak rdi jest nullem to status = 2, return -1 cmp rdi, 0 jle zaKrotkie ; jezeli dlugosc <= 0 albo buffer jest nullem to ; to status na 2 i return -1 ; w przeciwnym wypadku mov rdx, _GLOBAL_OFFSET_TABLE_ mov rdx, [rdx+mode wrt ..got] mov rdx, [rdx] xor rdx, 0x1 cmp rdx, 0x0 je topStore call storeTail ret topStore: call storeHead ret jestNULL2: call sstatus_syntax mov rax, -1 ret zaKrotkie: call sstatus_syntax mov rax, -1 ret storeHead: ; rdi, rsi ; |-length message|pointer_length|+8next|+16pref| ; chcielibysmy z przodu dolozyc nowego noda ; podpiac go z glowa i nastepnikiem glowy odpowiednio ; potem zapisac dlugosc, zaalokowac mallocckiem pamiec na kopie stringa ; wywyolac memcpy i skopiowac stringa ; no i dac status na 0 i return 0 jak sie zgadza ; albo status na 3 i return -1 jak sie malloc nie powiedzie ;mov rbx, [rel HEAD] ; lenegth, buf add rdi, 0x18 push rdi push rsi call malloc WRT ..plt test rax, rax jz mallocfail pop rsi pop rdi ; w rax jest destination sub rdi, 0x18 mov r12, rdi ; dlugosc do skopiowania w rdi ; chce w rdi - dest, rsi - source, rdx - dajemy dlugosc mov rdx, rdi mov rdi, rax call memcpy WRT ..plt ; kopiuje wiadomosc add rax, r12 ; przesuwa sie na poczatek length mov [rax], r12 ; zapisuje tam length ;mov rdi, rax ;mov rax, 0 ;call printf WRT ..plt mov rbx, [rel HEAD] mov rcx, [rbx + 8] mov [rax + 16], rbx ; do this.prev zapisz head mov [rax + 8], rcx; do this.next dalem head next mov [rcx + 16], rax ; do head.next.prev dalem this mov [rbx + 8], rax ; do head.next dalem this call countINC call sstatus_success mov rax, 0x0 ret mallocfail: call sstatus_alloc mov rax, -0x1 ret storeTail: ; chcielibysmy z tylu dolozyc nowego noda ; podpiac go z ogonem i poprzednikiem ogona odpowiednio ; potem zapisac dlugosc, zaalokowac mallocckiem pamiec na kopie stringa ; wywyolac memcpy i skopiowac stringa ; no i dac status na 0 i return 0 jak sie zgadza ; albo status na 3 i return -1 jak sie malloc nie powiedzie add rdi, 0x18 push rdi push rsi call malloc WRT ..plt test rax, rax jz mallocfail2 pop rsi pop rdi ; w rax jest destination sub rdi, 0x18 mov r12, rdi ; dlugosc do skopiowania w rdi ; chce w rdi - dest, rsi - source, rdx - dajemy dlugosc mov rdx, rdi mov rdi, rax call memcpy WRT ..plt ; kopiuje wiadomosc add rax, r12 ; przesuwa sie na poczatek length mov [rax], r12 ; zapisuje tam length mov rbx, [rel TAIL] mov rcx, [rbx + 16] ; w rcx tail pref ; w rax jest nowy dodany mov [rax + 16], rcx mov [rax + 8], rbx mov [rcx + 8], rax mov [rbx + 16], rax call countINC call sstatus_success mov rax, 0x0 ret mallocfail2: call sstatus_alloc mov rax, -0x1 ret top_length: mov r8, [rel bool] cmp r8, 0x1 je jump2 call init jump2: mov rax, [rel COUNTER] cmp rax, 0x0 jne dajemy_dlugosc call sstatus_empty mov rax, -0x1 ret dajemy_dlugosc: mov rdx, _GLOBAL_OFFSET_TABLE_ mov rdx, [rdx+mode wrt ..got] mov rdx, [rdx] xor rdx, 0x1 cmp rdx, 0x0 je top_head call top_lengthTail ret top_head: call top_lengthHead ret top_lengthHead: ; no wiec ustawia status na 0 i zwraca dlugosc ciagu od glowy call sstatus_success mov rbx, [rel HEAD] mov rcx, [rbx + 8] mov rax, [rcx] ret top_lengthTail: ; no wiec ustawia status na 0 i zwraca dlugosc ciagu od ogona call sstatus_success mov rbx, [rel TAIL] mov rcx, [rbx + 16] mov rax, [rcx] ret retrieve: push rdi mov r8, [rel bool] cmp r8, 0x1 je jump3 call init jump3: cmp rdi, 0 je jestNULL ; jak rdi jest nullem to status = 2, return -1 mov r10, [rel COUNTER] cmp r10, 0x0 je jestPusta usuwamy: mov rdx, _GLOBAL_OFFSET_TABLE_ mov rdx, [rdx+mode wrt ..got] mov rdx, [rdx] pop rdi xor rdx, 0x1 cmp rdx, 0x0 je head call retrieveTail ret head: ;mov rax, 0x0 ;call printf WRT ..plt call retrieveHead ret jestNULL: pop rdi call sstatus_syntax mov rax, -1 ret jestPusta: pop rdi call sstatus_empty mov rax, -1 ret retrieveHead: mov r14, rdi mov rbx, [rel HEAD] mov rcx, [rbx + 8] mov r12, [rcx] sub rcx, r12 ;mov rdi, r14 ;call free WRT ..plt ;mov rdi, r12 ;call malloc WRT ..plt mov rbx, [rel HEAD] mov rcx, [rbx + 8] mov r12, [rcx] mov r10, r12 ; length sub rcx, r12 mov r15, rcx ; poczatk drugiego mov rdi, rax mov rsi, rcx mov rdx, r12 call memcpy WRT ..plt add r14, r12 mov rax, 0x0 mov [r14], rax mov rbx, [rel HEAD] mov rcx, [rbx + 8] ; wskaznik na length drugiego mov rdx, [rcx + 8] ; wskaznik na length trzeciego mov [rbx + 8], rdx mov [rdx + 16], rbx mov r12, [rcx] sub rcx, r12 mov rdi, rcx call free WRT ..plt call countDEC call sstatus_success mov rax, 0x0 ret retrieveTail: ; w rdi ma wskaznik na buffer ; ma tam zapisac to co jest pierwsze na liscie od ogona ; i usunac tego noda i naprawic wskazniki + free ; zmniejszyc counter, status dac na zero i return tez 0 mov r14, rdi mov rbx, [rel HEAD] mov rcx, [rbx + 8] mov r12, [rcx] sub rcx, r12 ;mov rdi, r14 ;call free WRT ..plt ;mov rdi, r12 ;call malloc WRT ..plt mov rbx, [rel HEAD] mov rcx, [rbx + 8] mov r12, [rcx] mov r10, r12 ; length sub rcx, r12 mov r15, rcx ; poczatk drugiego mov rdi, rax mov rsi, rcx mov rdx, r12 call memcpy WRT ..plt add r14, r12 mov rax, 0x0 mov [r14], rax mov rbx, [rel HEAD] mov rcx, [rbx + 8] ; wskaznik na length drugiego mov rdx, [rcx + 8] ; wskaznik na length trzeciego mov [rbx + 8], rdx mov [rdx + 16], rbx mov r12, [rcx] sub rcx, r12 mov rdi, rcx call free WRT ..plt call countDEC call sstatus_success mov rax, 0x0 ret count: mov r8, [rel bool] cmp r8, 0x1 je jump4 call init jump4: call sstatus_success mov rax, [rel COUNTER] ret countINC: mov rax, [rel COUNTER] add rax, 0x1 mov [rel COUNTER], rax ret countDEC: mov rax, [rel COUNTER] sub rax, 0x1 mov [rel COUNTER], rax ret sstatus_success: mov rdx, _GLOBAL_OFFSET_TABLE_ mov rdx, [rdx+sstatus wrt ..got] mov qword [rdx], 0x0 ret sstatus_empty: mov rdx, _GLOBAL_OFFSET_TABLE_ mov rdx, [rdx+sstatus wrt ..got] mov qword [rdx], 0x1 ret sstatus_syntax: mov rdx, _GLOBAL_OFFSET_TABLE_ mov rdx, [rdx+sstatus wrt ..got] mov qword [rdx], 0x2 ret sstatus_alloc: mov rdx, _GLOBAL_OFFSET_TABLE_ mov rdx, [rdx+sstatus wrt ..got] mov qword [rdx], 0x3 ret SECTION .data sstatus DQ 0 mode DQ 0 bool DQ 0 HEAD DQ 0 TAIL DQ 0 COUNTER DQ 0 text DB 'WYPISALO SIE', 0 testuj DB '!', 0