Advertisement
dllbridge

Untitled

Apr 15th, 2024
764
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.38 KB | None | 0 0
  1.  
  2.  
  3. #include <stdio.h>
  4.  
  5.  
  6. int  sort (int *, int  );
  7. void swap (int &, int &);
  8. void print(int *, int  );
  9.  
  10. extern "C" {
  11.  
  12.     void  __stdcall _swap(  int *, int * );  
  13.     int   __stdcall _sort(  int *, int   );      
  14. }
  15.  
  16.  
  17. ////////////////////////////////////////////////////////
  18. int main()                                            //
  19. {
  20.  
  21.     int mas[99] = {5, 11, 2, 1117, 6, 34, 91, 1, 7},
  22.    
  23.           n     = _sort (mas, 9);  
  24.    
  25.     printf("Number of permutations = %d \n", n);
  26.    
  27.     print(mas, 9);
  28.  
  29. return 0;
  30. }
  31.  
  32.  
  33. //  stdcall-функция может как угодно менять eax, ecx и edx,
  34. //  не восстанавливая их потом.
  35. // - - - - - - - - - - - - - - - -
  36. //   1)  swap - Функция
  37. //   2)  Используем аналогию: по одному торту в каждой руке.
  38. //       Чтобы их поменять местами, потребуется стол.
  39. //        
  40. //  10)  Кол-во перестановок узнаём.
  41.  
  42.  
  43. ////////////////////////////////////////////////////////
  44. void swap(int &n1, int &n2)                           //
  45. {
  46.    
  47.      int n3 = n1;
  48.      
  49.          n1 = n2;
  50.          n2 = n3;
  51. }
  52.  
  53.  
  54. ////////////////////////////////////////////////////////
  55. int  sort(int *p, int n)                              //
  56. {
  57.    
  58.         int nF, nCount = 0;                                       //  Флаг  
  59.      
  60. L_01:       nF = 0;            
  61.    
  62.             for(int i = 0; i < n-1; i++)
  63.             {
  64.                                                            
  65.                 if( p[i] > p[i+1] ) { nF = 1;       //  = 1, если требуется перестановка  
  66.                                       nCount ++;
  67.                                     //  swap( p[i],  p[i+1] ); }
  68.                                      _swap(  &p[i], &p[i+1] ); }   
  69.             }
  70.            
  71.             if(nF) goto L_01;
  72.              
  73. return nCount;           
  74. }
  75.  
  76.  
  77.  
  78. ////////////////////////////////////////////////////////
  79. void print(int *p, int n)                             //
  80. {
  81.    
  82.      for(int i = 0; i < n; i++) {
  83.                                   printf("%d, ", p[i]);
  84.      }
  85.      
  86.      printf("\n");
  87. }
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99. // Пузырьковая сортировка на Си — это метод сортировки данных, который
  100. // работает путём сравнения соседних элементов и обмена их местами,
  101. // если необходимо. Алгоритм состоит из нескольких проходов по массиву,
  102. // каждый из которых улучшает порядок элементов.
  103.  
  104. //  FASM :
  105. include    'win32a.inc'
  106.  
  107.  
  108.  
  109.  
  110. format      MS COFF
  111.  
  112.  
  113.  
  114.  
  115. public     _sort                    as '__sort@8'
  116. public     _swap                    as '__swap@8'
  117.  
  118.  
  119.  
  120. section   '.text' code readable executable
  121.  
  122.  
  123. ;      Передаём указатели на элементы массива, которые следует
  124. ;                                             поменять местами.
  125. ;/////////////////////////////////////////////////////////////
  126. proc   _swap   p1, p2                                      ;//
  127.  
  128.  
  129.         mov  esi ,  [ p1]
  130.         mov  eax ,  [esi]
  131.         mov  edi ,  [ p2]
  132.         mov  edx ,  [edi]
  133.         mov [esi],   edx
  134.         mov [edi],   eax
  135.  
  136.         ret
  137. endp
  138.  
  139. ;  Специально для функции sort, чтобы упростить создание кода.
  140. ;                         В p адрес младшего из 2-х элементов
  141. ;////////////////////////////////////////////////////////////
  142. proc    swap   p                                          ;//
  143.  
  144.         push esi
  145.         push edi
  146.  
  147.        ; - - - - - - - - -
  148.         mov  esi ,  [ p ]             ; Адрес 1-го торта
  149.         mov  edi ,  [ p ]
  150.         add  edi ,     4              ; Адрес 2-го торта
  151.         mov  eax ,  [esi]             ; 1-й торт в левую руку   (в eax)
  152.  
  153.         cmp  eax ,  [edi]             ; Сравним 2 торта
  154.  
  155.         jle  L_01                     ; Если содержимое eax < ,то выходим
  156.  
  157.         mov  edx , [edi]              ; edx, как стол используем
  158.         mov [esi],  edx
  159.         mov [edi],  eax
  160.         mov [ nF],    1               ; Флаг помнит про перестановку
  161.         inc [nCount]                  ; Счётчик перестановок увеличиваем
  162.        ; - - - - - - - - -
  163.  
  164. L_01:   pop  edi
  165.         pop  esi
  166.         ret
  167. endp
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175. ;  stdcall-функция может как угодно менять eax, ecx и edx,
  176. ;  не восстанавливая их потом.
  177. ;/////////////////////////////////////////////////////////////
  178. proc   _sort   p, n                                        ;//
  179.  
  180.         dec   [n]
  181.  
  182.  
  183. L_05:   mov   esi ,  [p]
  184.         mov   ecx ,  [n]                                       ; число итераций
  185.         mov  [ nF],    0
  186.  
  187. L_02:   push  esi
  188.  
  189.         call swap
  190.         add   esi ,    4
  191.  
  192.         loop L_02                                          ; Команда цикла, переход на новый
  193.  
  194.         cmp   [nF],    1
  195.         jz   L_05
  196.         mov   eax , [nCount]
  197. ret
  198.  
  199. endp
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207. section '.data' data readable writeable
  208. ;-------------------------------------------------------------     Создание переменных:
  209.    arr     dd   4 dup(333)
  210.    nF      dd   0
  211.    nCount  dd   0
  212.  
  213.            
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement