Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Найти минимальное и максимальное значение в массиве и обменять их местами
- ; Здесь в esi - позиция минимального элемента
- ; Здесь в edi - позиция максимального элемента
- section .text
- global _start
- _start:
- ; Обнуляем регистры
- xor esi, esi
- xor edi, edi
- xor eax, eax
- xor ebx, ebx
- xor edx, edx
- mov ebx, arr ; Заносим адрес начала массива; В этом регистре будет храниться адрес текущего элемента
- mov eax, arr ; Заносим адрес начала массива;
- mov ecx, [size] ; Задаем количество элементов в массиве
- mov edx , [eax] ; Полагаем, что первый элемент минимальный. Заносим первый элемент массива в регистр
- doIteration:
- mov edx , [eax + esi*4] ; в edx заносим минимальный элемент, который находится на позиции esi
- cmp [ebx], edx ;Сравниваем очередной элемент массива [ebx] с минимальным edx. Если он минимальный, то переходим на метку findMax
- jg findMax
- mov esi , [index];Запоминаем текущий индекс в esi, в качестве минимального
- findMax:
- mov edx , [eax + edi*4] ; в edx заносим максимальный элемент, который находится на позиции edi
- cmp [ebx], edx ; Сравниваем очередной элемент массива [ebx] с максимальным edx. Если он максимальный, то переходим на метку newValues
- jl newValues
- mov edi , [index]
- newValues:
- add ebx , 4 ; Вычисляем адрес следующего элемента
- inc dword [index] ; Увеличиваем индекс
- loop doIteration
- mov dl, [eax + edi*4]
- mov [max], dl
- mov dl, [eax, + esi*4]
- mov [min], dl
- ;Выведем получившийся массив
- mov eax,1 ; counter
- mov edx, arr ; адресс первого элемента массива
- mov ecx, [size] ; размер массива
- mov bl, '0'
- mov [fl], bl ; Устанавливаем значение флага в 0
- whileStart:
- cmp eax, ecx
- jg whileEnd ; если прошлись по всему массиву, то прыгаем на whileEnd
- inc eax ; eax++
- push eax
- push ecx
- mov cl,[edx]
- add edx, 4 ; прибавляем 4 к указателю
- mov [simvol], cl ; получаем текущий элемент массива
- push edx
- ; Если текущий символ это минимальный или максимальный то прыгаем на set_flag
- mov dl, [min]
- cmp cl, dl
- je set_flag
- mov dl, [max]
- cmp cl, dl
- je set_flag
- jmp endif
- ;Прибавляем 1 к fl и прыгаем на print
- set_flag:
- mov bl, [fl]
- inc bl
- mov [fl], bl
- jmp print
- endif:
- mov bl, [fl]
- cmp bl, '1' ; Если fl == 1, то выводим 0, иначе элемент массива
- je print_zero
- jmp print
- ; Выводим 0
- print_zero:
- mov eax,4
- mov ecx, n
- mov ebx,1
- mov edx,1
- int 0x80
- jmp next5
- ; Выводим элемент массива
- print:
- mov eax,4
- mov ecx, simvol
- mov ebx,1
- mov edx,1
- int 0x80
- ; Выводим разделитель
- next5:
- mov eax,4
- mov ecx, separator
- mov ebx,1
- mov edx,1
- int 0x80
- pop edx
- pop ecx
- pop eax
- jmp whileStart ; Прыгаем в начало цикла
- ; Выходим из программы
- whileEnd:
- mov eax, 1
- int 0x80
- section .data
- index dd 0 ; Индекс текущего элемента
- ;Варианты массивов
- arr dd '1','4','4','3','9','5','1','2','2', '4', '3'
- ;arr dd '1','2','3','1','2','3','1','2','3'
- ;arr dd '1','1','1','1','1','1','1','1','1'
- simvol dd 0
- separator db ','
- newLine db 0
- size dd 9 ;Количество элементов в массиве
- n db '0'
- max db '0'
- min db '0'
- section .bss
- fl resb 1
Add Comment
Please, Sign In to add comment