Advertisement
Guest User

Untitled

a guest
Mar 24th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. section .bss
  2.  
  3. bufferPtr:          resb 8;                         pointer to buffer
  4. freeSemaphore:      resb 8;                         free slots of buffer
  5. usedSemaphore:      resb 8;                         used slots of buffer
  6. bufferSize:         resb 8;                         buffer size
  7. portion:            resb 8;                         portion-buffer for produce
  8.            
  9. section .rodata
  10.          
  11. maxBufferSize:  dd 0x7FFFFFFF;                      2^{31} - 1
  12.  
  13. section .text
  14.  
  15. global init
  16. global producer
  17. global consumer
  18.  
  19. extern produce
  20. extern consume
  21. extern malloc
  22.  
  23. extern proberen;
  24. extern verhogen;
  25.  
  26. ;helper labels (first 3 weren't combined in one because it adds non-sense complexity)
  27.  
  28. _returnMinusOne:
  29.     mov rax, -1;                                    set return value to -1
  30.     ret;                                            return -1
  31.            
  32. _returnMinusTwo:            
  33.     mov rax, -2;                                    set return value to -2
  34.     ret;                                            return -2
  35.                
  36. _returnMinusThree:          
  37.     mov rax, -3;                                    set return value to -3
  38.     ret;                                            return -3
  39.            
  40. _return:            
  41.     ret;                                            return
  42.  
  43. ; main labels
  44.  
  45. init:
  46.     mov qword [bufferSize], rdi;                     set value to N
  47.     mov dword [freeSemaphore], edi;                  set initial value to N
  48.     mov dword [usedSemaphore], 0;                    set initial value to 0  
  49.    
  50.     cmp qword [bufferSize], maxBufferSize;           comparison beetween N and 2^{31} - 1
  51.     ja _returnMinusOne;                              if greater return -1
  52.                                                      
  53.     cmp qword [bufferSize], 0;                       comparison with zero
  54.     je _returnMinusTwo;                              if zero return -2
  55.                                                      
  56.     mov rdi, qword [bufferSize];                     set parameter for malloc
  57.     imul rdi, 8;                                     multiply by 8
  58.     call malloc;                                    
  59.                                                      
  60.     mov qword [bufferPtr], rax;                      set malloc's return value to bufferPtr
  61.     cmp qword [bufferPtr], 0;                        check if null
  62.     je _returnMinusThree;                            return -3 if null
  63.     xor rax, rax;                                    overwise, return 0
  64.     ret;                                            
  65.                                                    
  66.                                                    
  67. producer:    
  68.     xor r8, r8;                                     buffer slot number  (k)
  69.     xor r9, r9;                                     portion             (p)
  70.    
  71. _producerLoop:
  72.     mov rdi, portion;                               set fst parameter as &portion
  73.     call produce;                                   produce(&portion)
  74.     mov r9, [rdi];                                  assing produced value to p
  75.     cmp eax, 0;                                     check if I should continue
  76.     je _return;                                     in not, return
  77.    
  78.     mov edi, freeSemaphore;                         if ok, set fst parameter as &"free"
  79.     call proberen;                                  P(free)
  80.    
  81.     mov rdi, [bufferPtr];
  82.     mov [rdi + 8*r8], r9;                           copy value of produce
  83.    
  84.     mov edi, usedSemaphore;                         set fst parameter as &"used"
  85.     call verhogen;                                  V(used)
  86. _producerModulo:  
  87.     mov rcx, rbx;
  88.     xor rdx, rdx;                                   clear rdx
  89.     mov rax, r8;                                    numerator = k
  90.     mov rbx, [bufferSize];                          denominator = N
  91.     inc rax;                                        k++
  92.     div rbx;                                        rdx:rax = (k + 1)%N:(k + )/N
  93.     mov r8, rdx;                                    k = (k + 1)%N
  94.     mov rbx, rcx;
  95.    
  96.     jmp _producerLoop;                              repeat
  97.    
  98.  
  99. consumer:
  100.     xor r8, r8;                                     buffer slot number  (k := r8)
  101.     xor r9, r9;                                     portion             (p := r9)
  102.    
  103. _consumerLoop:
  104.     mov edi, usedSemaphore;                         set fst parameter as &"used"
  105.     call proberen;                                  P(used)
  106.    
  107.     mov rdi, [bufferPtr];
  108.     mov r9, [rdi + 8*r8];                           p = buffer[k]
  109.    
  110.     mov edi, freeSemaphore;                         set fst parameter as &"free"
  111.     call verhogen;                                  V(free)
  112.    
  113. _consumerModulo:    
  114.     mov rcx, rbx
  115.     xor rdx, rdx;                                   clear rdx
  116.     mov rax, r8;                                    numerator = k
  117.     mov rbx, [bufferSize];                          denominator = N
  118.     inc rax;                                        k++
  119.     div rbx;                                        rdx:rax = (k + 1)%N:(k + )/N
  120.     mov r8, rdx;                                    k = (k + 1)%N
  121.     mov rbx, rcx;
  122.    
  123.     mov rdi, r9;                                    set fst parameter as "p"
  124.     call consume;                                   consume(p)
  125.    
  126.     cmp eax, 0;
  127.     je _return;
  128.    
  129.     jmp _consumerLoop;                              repeat
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement