Facebook
From Gray Duck, 7 Years ago, written in x86 Assembler.
Embed
Download Paste or View Raw
Hits: 254
  1. BITS 64
  2.  
  3. GLOBAL sstatus:data 4, mode:data 4
  4. GLOBAL store:function, top_length:function, retrieve:function, count:function
  5.  
  6. EXTERN malloc, printf, strncpy, free, memcpy, strlen, _GLOBAL_OFFSET_TABLE_
  7. ; void* malloc (size_t size);
  8. ; void free( void * ptr );
  9. ; void *memcpy ( void * destination, const void * source, size_t num );
  10. ; size_t strlen(const char *str)
  11.  
  12. init:
  13.         push rcx
  14.         push rdi
  15.         push rax
  16.         push rbx
  17.         push rdx
  18.         push rsi
  19.         mov rcx, 0x1
  20.         mov [rel bool], rcx
  21.  
  22.         mov rdi, 0x18
  23.         mov rax, 0x0
  24.         call malloc WRT ..plt
  25.         mov [rel HEAD], rax; wskaznik do pamieci gdzie HEAD
  26.  
  27.         mov rdi, 0x18
  28.         mov rax, 0x0
  29.         call malloc WRT ..plt
  30.         mov [rel TAIL], rax; wskaznik do pamieci gdzie TAIL
  31.  
  32.         mov rbx, [rel HEAD]
  33.         mov rdx, [rel TAIL]
  34.         mov rcx, 0x0
  35.         mov [rbx], rcx
  36.         mov [rdx], rcx
  37.         mov [rbx + 8], rdx
  38.         mov [rdx + 8], rcx
  39.         mov [rbx + 16], rcx
  40.         mov [rdx + 16], rbx
  41.  
  42.         ;mov rdi, text
  43.         ;mov rax, 0
  44.         ;call printf WRT ..plt
  45.  
  46.         pop rsi
  47.         pop rdx
  48.         pop rbx
  49.         pop rax
  50.         pop rdi
  51.         pop rcx
  52.         ret
  53.  
  54. store:
  55.         mov r8, [rel bool]
  56.         cmp r8, 0x1
  57.         je jump
  58.         call init
  59.         jump:
  60.  
  61.         cmp rsi, 0
  62.         je jestNULL2
  63.         ; jak rdi jest nullem to status = 2, return -1
  64.         cmp rdi, 0
  65.         jle zaKrotkie
  66.  
  67.         ; jezeli dlugosc <= 0 albo buffer jest nullem to
  68.         ; to status na 2 i return -1
  69.         ; w przeciwnym wypadku
  70.         mov rdx, _GLOBAL_OFFSET_TABLE_
  71.         mov rdx, [rdx+mode wrt ..got]
  72.         mov rdx, [rdx]
  73.         xor rdx, 0x1
  74.         cmp rdx, 0x0
  75.         je topStore
  76.                 call storeTail
  77.                 ret
  78.         topStore:
  79.                 call storeHead
  80.                 ret
  81.         jestNULL2:
  82.                 call sstatus_syntax
  83.                 mov rax, -1
  84.                 ret
  85.         zaKrotkie:
  86.                 call sstatus_syntax
  87.                 mov rax, -1
  88.                 ret
  89.  
  90. storeHead:
  91.         ; rdi, rsi
  92.         ; |-length message|pointer_length|+8next|+16pref|
  93.         ; chcielibysmy z przodu dolozyc nowego noda
  94.         ; podpiac go z glowa i nastepnikiem glowy odpowiednio
  95.         ; potem zapisac dlugosc, zaalokowac mallocckiem pamiec na kopie stringa
  96.         ; wywyolac memcpy i skopiowac stringa
  97.         ; no i dac status na 0 i return 0 jak sie zgadza
  98.         ; albo status na 3 i return -1 jak sie malloc nie powiedzie
  99.         ;mov rbx, [rel HEAD]
  100.         ; lenegth, buf
  101.  
  102.         add rdi, 0x18
  103.         push rdi
  104.         push rsi
  105.         call malloc WRT ..plt
  106.         test rax, rax
  107.         jz mallocfail
  108.         pop rsi
  109.         pop rdi
  110.         ; w rax jest destination
  111.         sub rdi, 0x18
  112.         mov r12, rdi
  113.         ; dlugosc do skopiowania w rdi
  114.         ; chce w rdi - dest, rsi - source, rdx - dajemy dlugosc
  115.         mov rdx, rdi
  116.         mov rdi, rax
  117.         call memcpy WRT ..plt ; kopiuje wiadomosc
  118.        
  119.         add rax, r12 ; przesuwa sie na poczatek length
  120.  
  121.         mov [rax], r12 ; zapisuje tam length
  122.  
  123.         ;mov rdi, rax
  124.         ;mov rax, 0
  125.         ;call printf WRT ..plt
  126.         mov rbx, [rel HEAD]
  127.         mov rcx, [rbx + 8]
  128.         mov [rax + 16], rbx ; do this.prev zapisz head
  129.         mov [rax + 8], rcx; do this.next dalem head next
  130.         mov [rcx + 16], rax ; do head.next.prev dalem this
  131.         mov [rbx + 8], rax ; do head.next dalem this
  132.         call countINC
  133.         call sstatus_success
  134.         mov rax, 0x0
  135.         ret
  136.         mallocfail:
  137.                 call sstatus_alloc
  138.                 mov rax, -0x1
  139.                 ret
  140.  
  141. storeTail:
  142.         ; chcielibysmy z tylu dolozyc nowego noda
  143.         ; podpiac go z ogonem i poprzednikiem ogona odpowiednio
  144.         ; potem zapisac dlugosc, zaalokowac mallocckiem pamiec na kopie stringa
  145.         ; wywyolac memcpy i skopiowac stringa
  146.         ; no i dac status na 0 i return 0 jak sie zgadza
  147.         ; albo status na 3 i return -1 jak sie malloc nie powiedzie
  148.  
  149.         add rdi, 0x18
  150.         push rdi
  151.         push rsi
  152.         call malloc WRT ..plt
  153.         test rax, rax
  154.         jz mallocfail2
  155.         pop rsi
  156.         pop rdi
  157.         ; w rax jest destination
  158.         sub rdi, 0x18
  159.         mov r12, rdi
  160.         ; dlugosc do skopiowania w rdi
  161.         ; chce w rdi - dest, rsi - source, rdx - dajemy dlugosc
  162.         mov rdx, rdi
  163.         mov rdi, rax
  164.         call memcpy WRT ..plt ; kopiuje wiadomosc
  165.        
  166.         add rax, r12 ; przesuwa sie na poczatek length
  167.  
  168.         mov [rax], r12 ; zapisuje tam length
  169.  
  170.         mov rbx, [rel TAIL]
  171.         mov rcx, [rbx + 16] ; w rcx tail pref
  172.         ; w rax jest nowy dodany
  173.         mov [rax + 16], rcx
  174.         mov [rax + 8], rbx
  175.         mov [rcx + 8], rax
  176.         mov [rbx + 16], rax
  177.         call countINC
  178.         call sstatus_success
  179.         mov rax, 0x0
  180.         ret
  181.         mallocfail2:
  182.                 call sstatus_alloc
  183.                 mov rax, -0x1
  184.                 ret
  185.  
  186. top_length:
  187.         mov r8, [rel bool]
  188.         cmp r8, 0x1
  189.         je jump2
  190.         call init
  191.         jump2:
  192.         mov rax, [rel COUNTER]
  193.         cmp rax, 0x0
  194.         jne dajemy_dlugosc
  195.                 call sstatus_empty
  196.                 mov rax, -0x1
  197.                 ret
  198.         dajemy_dlugosc:
  199.                 mov rdx, _GLOBAL_OFFSET_TABLE_
  200.                 mov rdx, [rdx+mode wrt ..got]
  201.                 mov rdx, [rdx]
  202.                 xor rdx, 0x1
  203.                 cmp rdx, 0x0
  204.                 je top_head
  205.                 call top_lengthTail
  206.                 ret
  207.         top_head:
  208.                 call top_lengthHead
  209.                 ret
  210.  
  211. top_lengthHead:
  212.         ; no wiec ustawia status na 0 i zwraca dlugosc ciagu od glowy
  213.         call sstatus_success
  214.         mov rbx, [rel HEAD]
  215.         mov rcx, [rbx + 8]
  216.         mov rax, [rcx]
  217.         ret
  218.  
  219. top_lengthTail:
  220.         ; no wiec ustawia status na 0 i zwraca dlugosc ciagu od ogona
  221.         call sstatus_success
  222.         mov rbx, [rel TAIL]
  223.         mov rcx, [rbx + 16]
  224.         mov rax, [rcx]
  225.         ret
  226.  
  227. retrieve:
  228.         push rdi
  229.         mov r8, [rel bool]
  230.         cmp r8, 0x1
  231.         je jump3
  232.         call init
  233.         jump3:
  234.  
  235.         cmp rdi, 0
  236.         je jestNULL
  237.         ; jak rdi jest nullem to status = 2, return -1
  238.  
  239.         mov r10, [rel COUNTER]
  240.         cmp r10, 0x0
  241.         je jestPusta
  242.  
  243.         usuwamy:
  244.                 mov rdx, _GLOBAL_OFFSET_TABLE_
  245.                 mov rdx, [rdx+mode wrt ..got]
  246.                 mov rdx, [rdx]
  247.                 pop rdi
  248.                 xor rdx, 0x1
  249.                 cmp rdx, 0x0
  250.                 je head
  251.                 call retrieveTail
  252.                 ret
  253.         head:
  254.                 ;mov rax, 0x0
  255.                 ;call printf WRT ..plt
  256.                 call retrieveHead
  257.                 ret
  258.         jestNULL:
  259.                 pop rdi
  260.                 call sstatus_syntax
  261.                 mov rax, -1
  262.                 ret
  263.         jestPusta:
  264.                 pop rdi
  265.                 call sstatus_empty
  266.                 mov rax, -1
  267.                 ret
  268.  
  269. retrieveHead:
  270.         mov r14, rdi
  271.         mov rbx, [rel HEAD]
  272.         mov rcx, [rbx + 8]
  273.         mov r12, [rcx]
  274.         sub rcx, r12
  275.  
  276.         ;mov rdi, r14
  277.         ;call free WRT ..plt
  278.         ;mov rdi, r12
  279.         ;call malloc WRT ..plt
  280.  
  281.         mov rbx, [rel HEAD]
  282.         mov rcx, [rbx + 8]
  283.         mov r12, [rcx]
  284.         mov r10, r12 ; length
  285.         sub rcx, r12
  286.         mov r15, rcx ; poczatk drugiego
  287.  
  288.         mov rdi, rax
  289.         mov rsi, rcx
  290.         mov rdx, r12
  291.         call memcpy WRT ..plt
  292.         add r14, r12
  293.         mov rax, 0x0
  294.         mov [r14], rax
  295.  
  296.         mov rbx, [rel HEAD]
  297.         mov rcx, [rbx + 8] ; wskaznik na length drugiego
  298.         mov rdx, [rcx + 8] ; wskaznik na length trzeciego
  299.  
  300.         mov [rbx + 8], rdx
  301.         mov [rdx + 16], rbx
  302.  
  303.         mov r12, [rcx]
  304.         sub rcx, r12
  305.         mov rdi, rcx
  306.         call free WRT ..plt
  307.  
  308.         call countDEC
  309.         call sstatus_success
  310.         mov rax, 0x0
  311.         ret
  312.  
  313. retrieveTail:
  314.         ; w rdi ma wskaznik na buffer
  315.         ; ma tam zapisac to co jest pierwsze na liscie od ogona
  316.         ; i usunac tego noda i naprawic wskazniki + free
  317.         ; zmniejszyc counter, status dac na zero i return tez 0
  318.         mov r14, rdi
  319.         mov rbx, [rel HEAD]
  320.         mov rcx, [rbx + 8]
  321.         mov r12, [rcx]
  322.         sub rcx, r12
  323.  
  324.         ;mov rdi, r14
  325.         ;call free WRT ..plt
  326.         ;mov rdi, r12
  327.         ;call malloc WRT ..plt
  328.  
  329.         mov rbx, [rel HEAD]
  330.         mov rcx, [rbx + 8]
  331.         mov r12, [rcx]
  332.         mov r10, r12 ; length
  333.         sub rcx, r12
  334.         mov r15, rcx ; poczatk drugiego
  335.  
  336.         mov rdi, rax
  337.         mov rsi, rcx
  338.         mov rdx, r12
  339.         call memcpy WRT ..plt
  340.         add r14, r12
  341.         mov rax, 0x0
  342.         mov [r14], rax
  343.  
  344.         mov rbx, [rel HEAD]
  345.         mov rcx, [rbx + 8] ; wskaznik na length drugiego
  346.         mov rdx, [rcx + 8] ; wskaznik na length trzeciego
  347.  
  348.         mov [rbx + 8], rdx
  349.         mov [rdx + 16], rbx
  350.  
  351.         mov r12, [rcx]
  352.         sub rcx, r12
  353.         mov rdi, rcx
  354.         call free WRT ..plt
  355.  
  356.  
  357.         call countDEC
  358.         call sstatus_success
  359.         mov rax, 0x0
  360.         ret
  361.  
  362. count:
  363.         mov r8, [rel bool]
  364.         cmp r8, 0x1
  365.         je jump4
  366.         call init
  367.         jump4:
  368.         call sstatus_success
  369.         mov rax, [rel COUNTER]
  370.         ret
  371.  
  372. countINC:
  373.         mov rax, [rel COUNTER]
  374.         add rax, 0x1
  375.         mov [rel COUNTER], rax
  376.         ret
  377.  
  378. countDEC:
  379.         mov rax, [rel COUNTER]
  380.         sub rax, 0x1
  381.         mov [rel COUNTER], rax
  382.         ret
  383.  
  384. sstatus_success:
  385.         mov rdx, _GLOBAL_OFFSET_TABLE_
  386.         mov rdx, [rdx+sstatus wrt ..got]
  387.         mov qword [rdx], 0x0
  388.         ret
  389.  
  390. sstatus_empty:
  391.         mov rdx, _GLOBAL_OFFSET_TABLE_
  392.         mov rdx, [rdx+sstatus wrt ..got]
  393.         mov qword [rdx], 0x1
  394.         ret
  395.  
  396. sstatus_syntax:
  397.         mov rdx, _GLOBAL_OFFSET_TABLE_
  398.         mov rdx, [rdx+sstatus wrt ..got]
  399.         mov qword [rdx], 0x2
  400.         ret
  401.  
  402. sstatus_alloc:
  403.         mov rdx, _GLOBAL_OFFSET_TABLE_
  404.         mov rdx, [rdx+sstatus wrt ..got]
  405.         mov qword [rdx], 0x3
  406.         ret
  407.  
  408. SECTION .data
  409. sstatus                 DQ      0
  410. mode                    DQ      0
  411. bool                    DQ      0
  412.  
  413. HEAD                    DQ  0
  414. TAIL                    DQ      0
  415.  
  416. COUNTER                 DQ      0
  417. text                    DB  'WYPISALO SIE', 0
  418. testuj                  DB  '!', 0