smutnyjoe

Untitled

Mar 24th, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. extern malloc
  2. extern produce
  3. extern consume
  4. extern proberen
  5. extern verhogen
  6.  
  7. section .text
  8.     global init
  9.     global producer
  10.     global consumer
  11.  
  12. align 8
  13.  
  14. ; FUNKCJA INIT
  15. init:
  16.     cmp rdi, 2147483647             ; N (edi) > 2^{31} - 1
  17.     jg toobig
  18.    
  19.     cmp edi, 0                      ; N (edi) = 0
  20.     je zero
  21.  
  22.     mov [size], edi                 ; zapisuje rozmiar bufora
  23.     mov [wolne], edi                ; w edi jest size_t N, na tyle mam zainicjalizowac semafor wolne
  24.     mov dword [zajete], 0           ; z kolei semafor zajete na 0
  25.     imul rdi, 8
  26.     call malloc                     ; liczba bajtow do malloca powinna byc w rdi, juz jest
  27.    
  28.     cmp rax, 0                      ; gdy alokacja sie nie uda, malloc umieszcza 0 w rax
  29.     je not_allocated
  30.    
  31.     mov [index_producer], rax       ; po malloc w rax jest wskaznik na poczatek zarezerwowanej tablicy
  32.     mov [index_consumer], rax
  33.     mov [poczatek], rax             ; ustawiam wskaznik poczatku bufora na rax
  34.    
  35.     mov rax, 0                      ; poprawne wykonanie, zwracam 0      
  36.     ret
  37.  
  38. toobig:
  39.     mov rax, -1                     ; za duze N, zwracam -1
  40.     ret
  41. zero:
  42.     mov rax, -2                     ; N = 0, zwracam -2
  43.     ret
  44. not_allocated:
  45.     mov rax, -3                     ; blad alokacji, zwracam -3
  46.     ret
  47.  
  48.  
  49. ; FUNKCJA PRODUCER
  50. producer:
  51.     mov qword [k_producer], 0       ; ustawiam "prawdziwy" indeks producenta na 0
  52.  
  53. producer_start_loop:
  54.     mov rdi, produkt_producer       ; wskaznik na zmienna - produkt w rdi
  55.     call produce                    ; produce w miejscu wskazywanym przez rdi umiesci produkt
  56.  
  57.     cmp rax, 0                      ; funkcja zwraca 1, gdy nie wyprodukowala danych
  58.     je producer_return              ; wtedy producer ma sie zakonczyc
  59.  
  60.     mov rdi, wolne                  ; w rdi umieszczam wskaznik na semafor wolne
  61.     call proberen                   ; probuje opuscic semafor wolne, czyli zmniejszam liczbe miejsc wolnych
  62.    
  63.    
  64.  
  65.     mov rcx, [index_producer]       ; przenosze, gdyz "podwojny" wskaznik
  66.     mov rbx, [produkt_producer]     ; przenosze, gdyz nie mozna mov z pamieci do pamieci tylko do rejestru
  67.     mov [rcx], rbx                  ; w skorcie mov [[index]], [produkt]
  68.  
  69.     mov rdi, zajete                 ; w rdi umieszczam wskaznik na semafor zajete
  70.     call verhogen                   ; podnosze semafor zajete, czyli zwiekszam liczbe miejsc zajetych
  71.    
  72.     inc qword [k_producer]          ; zwiekszam indeks k producenta
  73.  
  74.     mov rcx, [k_producer]           ; bo w cmp jeden operand musi byc rejestrem
  75.     cmp rcx, [size]                 ; sprawdzam czy przypadkiem nie przekroczyl rozmiaru bufora
  76.     jge producer_cycle              ; jesli tak to skacze do producer_cycle
  77.  
  78.     add qword [index_producer], 8   ; wpp index++
  79.  
  80. producer_continue:                  ; do powrotu z producer_cycle, gdzie wyzerowalem k i ustawilem [index_producer] na [poczatek]
  81.     jmp producer_start_loop         ; skacze do poczatku petli, bo przekierowanie na wyjscie z petli jest gdzie indziej
  82.  
  83. producer_cycle:                     ; tzn k = size, trzeba wrocic na poczatek bufora
  84.     mov qword [k_producer], 0       ; ustawiam k na 0
  85.  
  86.     mov rcx, index_producer        
  87.     mov rbx, [poczatek]
  88.     mov [rcx], rbx                  ; w skorcie mov [[index_producer]], [poczatek] - semantyka mov tego wymaga
  89.  
  90.     jmp producer_continue
  91.  
  92. producer_return:
  93.     ret
  94.  
  95. ; FUNKCJA CONSUMER
  96. consumer:
  97.     mov qword [k_consumer], 0
  98.  
  99. consumer_start_loop:
  100.     mov rdi, zajete                 ; w rdi umieszczam wskaznik na semafor zajete
  101.     call proberen                   ; probuje przejsc przez semafor zajete
  102.  
  103.     mov rbx, [index_consumer]       ; w rbx zapisuje produkt z bufora
  104.     mov rcx, [rbx]                  ; i przenosze go do zmiennej produkt_consumer
  105.     mov [produkt_consumer], rcx
  106.  
  107.     mov rdi, wolne                  ; w rdi umieszczam wskaznik na semafor wolne
  108.     call verhogen                   ; i podnosze semafor wolne
  109.  
  110.     inc qword [k_consumer]          ; zwiekszam prawdziwy indeks
  111.     mov rcx, [k_consumer]           ; bo w cmp jednym operandem musi byc rejestr
  112.     cmp rcx, [size]                 ; sprawdzam czy prawdziwy indeks nie przekroczyl rozmiaru
  113.     jge consumer_cycle              ; jesli tak to musze przeskoczyc na 0
  114.  
  115.     add qword [index_consumer], 8   ; wpp. zwiekszam wskaznik na adres kolejnej komorki w buforze
  116.  
  117. consumer_continue:                  ; do powrotu z consumer_cycle, gdzie wyzerowalem k i ustawilem [index_consumer] na [poczatek]
  118.    
  119.     mov rdi, [produkt_consumer]     ; umieszczam w rdi, czyli w argumencie funkcji produkt
  120.     call consume                    ; i wolam funkcje consume
  121.  
  122.     cmp rax, 1
  123.     je consumer_start_loop          ; jesli funkcja consume zwrocila 1, to skacze do poczatku petli
  124.  
  125.     ret                             ; wpp zwrocila 0, wiec koncze funkcje consumer
  126.  
  127. consumer_cycle:                     ; pelny cykl, tzn. zmienna k przekroczyla rozmiar bufora
  128.     mov qword [k_consumer], 0       ; ustawiam zmienna na 0
  129.    
  130.     mov rcx, index_consumer  
  131.     mov rbx, [poczatek]
  132.     mov [rcx], rbx                  ; w skorcie mov [index_consumer], [poczatek] - semantyka mov tego wymaga
  133.    
  134.     jmp consumer_continue
  135.  
  136. section .bss
  137.     digitSpace: resb 100
  138.     digitSpacePos: resb 8
  139.     index_producer: resq 1
  140.     index_consumer: resq 1
  141.     zajete: resd 1
  142.     wolne: resd 1
  143.     produkt_producer: resq 1
  144.     produkt_consumer: resq 1
  145.     poczatek: resq 1
  146.     k_producer: resq 1              ; "prawdziwy" indeks producenta
  147.     k_consumer: resq 1              ; "prawdziwy" index konsumenta
  148.     size: resq 1
Add Comment
Please, Sign In to add comment