Advertisement
StreetKatya

Сисадмин

Sep 15th, 2021
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.11 KB | None | 0 0
  1. ;Системный администратор раз в неделю создаёт архив пользовательских файлов.
  2. ;Однако объём диска, куда он помещает архив, может быть меньше, чем суммарный объём архивируемых файлов.
  3. ;Известно, какой объём занимает файл каждого пользователя.
  4. ;Администратор сохраняет файлы по следующему правилу: выбирается файл максимального размера,
  5. ;который может быть записан на диск, затем выбирается файл минимального размера, который
  6. ;может быть записан на диск. Данный сценарий повторяется до тех пор, пока на диск нельзя
  7. ;будет записать ни одного из оставшихся файлов.
  8.  
  9. format PE console
  10. entry start
  11. include 'includes\win32ax.inc'
  12. ; одномернный массив
  13. section '.data' data readable writeable
  14. MaxCnt = 100
  15. N dd ?
  16. Array dd MaxCnt dup(?)
  17. Mem dd ?
  18. TotSum dd ?
  19. Cnt dd ?
  20. LastNum dd ?
  21. flag dd ?
  22.  
  23. section '.code' code readable executable
  24. start:
  25. cinvoke printf," Total Memory = "
  26. cinvoke scanf, "%d", Mem
  27. cinvoke printf," Number of users = "
  28. cinvoke scanf, "%d", N
  29.  
  30. ; ввод массива
  31. mov ecx,[N]
  32. mov esi, Array
  33. readArr:
  34. push ecx
  35. cinvoke scanf,"%d",esi
  36. cmp eax,1
  37. jne er1
  38. add esi,4
  39. pop ecx
  40. loop readArr
  41. ; сортировка прямым выбор
  42. mov ecx,[N]
  43. dec ecx
  44. mov esi, Array
  45. l1: mov edi, esi ; смещение минимума
  46. mov eax, [edi] ; минимум
  47. mov ebp, esi
  48. add ebp, 4 ; смещение очередного элемента
  49. push ecx
  50. l2: cmp eax,[ebp]
  51. jle _l2
  52. mov eax,[ebp]
  53. mov edi, ebp
  54. _l2: add ebp,4
  55. loop l2
  56. mov ebx , [esi] ;обмен
  57. mov [esi], eax
  58. mov [edi], ebx
  59. pop ecx
  60. add esi, 4
  61. loop l1
  62. ;работа с памятью
  63. mov esi,Array
  64. mov edi,Array
  65. mov eax,[N]
  66. mov ebx,4
  67. imul ebx
  68. add esi,eax
  69. sub esi,4
  70.  
  71. m1:
  72. mov eax,[Mem]
  73. cmp [TotSum],eax ;если общая сумма больше
  74. jg vivod
  75. mov eax,esi
  76. add eax,4
  77. cmp eax,edi ;если рассматривается одна и та же ячейка
  78. je vivod
  79. ;обработка большего элемента
  80. mov eax,[esi]
  81. add [TotSum],eax
  82. mov eax,[Mem]
  83. cmp [TotSum],eax
  84. jg otkat1
  85. mov eax,[esi]
  86. mov [LastNum],eax
  87. inc [Cnt]
  88. sub esi,4
  89. ;обработка меньшего элемента
  90. small:
  91. mov eax,edi
  92. sub eax,4
  93. cmp esi,eax;если рассматривается одна и та же ячейка
  94. je vivod
  95. mov eax,[edi]
  96. add [TotSum],eax
  97. mov eax,[Mem]
  98. cmp [TotSum],eax
  99. jg otkat2
  100. mov eax,[edi]
  101. mov [LastNum],eax
  102. inc [Cnt]
  103. add edi,4
  104. jmp m1
  105. otkat1:
  106. mov eax,[esi]
  107. sub [TotSum],eax
  108. sub esi,4
  109. jmp m1
  110. otkat2:
  111. mov eax,[edi]
  112. sub [TotSum],eax
  113. add edi,4
  114. jmp small
  115.  
  116.  
  117. ;вывод
  118. vivod:
  119. cinvoke printf, "%d ", dword [Cnt]
  120. cinvoke printf, "%d ", dword [LastNum]
  121. jmp exit
  122.  
  123. er1: cinvoke printf,"Input Error"
  124. exit:
  125.  
  126. cinvoke getchar
  127. invoke ExitProcess,0
  128.  
  129.  
  130.  
  131. section '.idata' import data readable writeable
  132. library kernel32,'kernel32.dll', msvcrt, 'msvcrt.dll'
  133. import kernel32,ExitProcess , 'ExitProcess' ,\
  134. GetStdHandle,'GetStdHandle',\
  135. WriteConsole,'WriteConsoleA',\
  136. ReadConsole,'ReadConsoleA',\
  137. GetProcessHeap, 'GetProcessHeap',\
  138. HeapCreate , 'HeapCreate' ,\
  139. HeapDestroy , 'HeapDestroy' ,\
  140. HeapAlloc , 'HeapAlloc' ,\
  141. HeapFree , 'HeapFree'
  142. import msvcrt, printf,'printf',scanf, 'scanf' ,getchar,'getchar'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement