Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;Системный администратор раз в неделю создаёт архив пользовательских файлов.
- ;Однако объём диска, куда он помещает архив, может быть меньше, чем суммарный объём архивируемых файлов.
- ;Известно, какой объём занимает файл каждого пользователя.
- ;Администратор сохраняет файлы по следующему правилу: выбирается файл максимального размера,
- ;который может быть записан на диск, затем выбирается файл минимального размера, который
- ;может быть записан на диск. Данный сценарий повторяется до тех пор, пока на диск нельзя
- ;будет записать ни одного из оставшихся файлов.
- format PE console
- entry start
- include 'includes\win32ax.inc'
- ; одномернный массив
- section '.data' data readable writeable
- MaxCnt = 100
- N dd ?
- Array dd MaxCnt dup(?)
- Mem dd ?
- TotSum dd ?
- Cnt dd ?
- LastNum dd ?
- flag dd ?
- section '.code' code readable executable
- start:
- cinvoke printf," Total Memory = "
- cinvoke scanf, "%d", Mem
- cinvoke printf," Number of users = "
- cinvoke scanf, "%d", N
- ; ввод массива
- mov ecx,[N]
- mov esi, Array
- readArr:
- push ecx
- cinvoke scanf,"%d",esi
- cmp eax,1
- jne er1
- add esi,4
- pop ecx
- loop readArr
- ; сортировка прямым выбор
- mov ecx,[N]
- dec ecx
- mov esi, Array
- l1: mov edi, esi ; смещение минимума
- mov eax, [edi] ; минимум
- mov ebp, esi
- add ebp, 4 ; смещение очередного элемента
- push ecx
- l2: cmp eax,[ebp]
- jle _l2
- mov eax,[ebp]
- mov edi, ebp
- _l2: add ebp,4
- loop l2
- mov ebx , [esi] ;обмен
- mov [esi], eax
- mov [edi], ebx
- pop ecx
- add esi, 4
- loop l1
- ;работа с памятью
- mov esi,Array
- mov edi,Array
- mov eax,[N]
- mov ebx,4
- imul ebx
- add esi,eax
- sub esi,4
- m1:
- mov eax,[Mem]
- cmp [TotSum],eax ;если общая сумма больше
- jg vivod
- mov eax,esi
- add eax,4
- cmp eax,edi ;если рассматривается одна и та же ячейка
- je vivod
- ;обработка большего элемента
- mov eax,[esi]
- add [TotSum],eax
- mov eax,[Mem]
- cmp [TotSum],eax
- jg otkat1
- mov eax,[esi]
- mov [LastNum],eax
- inc [Cnt]
- sub esi,4
- ;обработка меньшего элемента
- small:
- mov eax,edi
- sub eax,4
- cmp esi,eax;если рассматривается одна и та же ячейка
- je vivod
- mov eax,[edi]
- add [TotSum],eax
- mov eax,[Mem]
- cmp [TotSum],eax
- jg otkat2
- mov eax,[edi]
- mov [LastNum],eax
- inc [Cnt]
- add edi,4
- jmp m1
- otkat1:
- mov eax,[esi]
- sub [TotSum],eax
- sub esi,4
- jmp m1
- otkat2:
- mov eax,[edi]
- sub [TotSum],eax
- add edi,4
- jmp small
- ;вывод
- vivod:
- cinvoke printf, "%d ", dword [Cnt]
- cinvoke printf, "%d ", dword [LastNum]
- jmp exit
- er1: cinvoke printf,"Input Error"
- exit:
- cinvoke getchar
- invoke ExitProcess,0
- section '.idata' import data readable writeable
- library kernel32,'kernel32.dll', msvcrt, 'msvcrt.dll'
- import kernel32,ExitProcess , 'ExitProcess' ,\
- GetStdHandle,'GetStdHandle',\
- WriteConsole,'WriteConsoleA',\
- ReadConsole,'ReadConsoleA',\
- GetProcessHeap, 'GetProcessHeap',\
- HeapCreate , 'HeapCreate' ,\
- HeapDestroy , 'HeapDestroy' ,\
- HeapAlloc , 'HeapAlloc' ,\
- HeapFree , 'HeapFree'
- import msvcrt, printf,'printf',scanf, 'scanf' ,getchar,'getchar'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement