vadimpirog

Untitled

Nov 17th, 2021 (edited)
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. ; Найти минимальное и максимальное значение в массиве и обменять их местами
  3. ; Здесь в esi - позиция минимального элемента
  4. ; Здесь в edi - позиция максимального элемента
  5. section .text
  6. global _start
  7. _start:
  8.  ; Обнуляем регистры
  9.  xor esi, esi
  10.  xor edi, edi
  11.  xor eax, eax
  12.  xor ebx, ebx
  13.  xor edx, edx
  14.  mov ebx, arr ; Заносим адрес начала массива; В этом регистре будет храниться адрес текущего элемента
  15.  
  16.  mov eax, arr ; Заносим адрес начала массива;
  17.  mov ecx, [size] ; Задаем количество элементов в массиве
  18.  mov edx , [eax] ; Полагаем, что первый элемент минимальный. Заносим первый элемент массива в регистр
  19.  
  20.  
  21. doIteration:
  22.  mov edx , [eax + esi*4] ; в edx заносим минимальный элемент, который находится на позиции esi
  23.  
  24.  cmp [ebx], edx ;Сравниваем очередной элемент массива [ebx] с минимальным edx. Если он минимальный, то переходим на метку findMax
  25.  
  26.  jg findMax
  27.  mov esi , [index];Запоминаем текущий индекс в esi, в качестве минимального
  28.  
  29. findMax:
  30.  mov edx , [eax + edi*4] ; в edx заносим максимальный элемент, который находится на позиции edi
  31.  
  32.  cmp [ebx], edx ; Сравниваем очередной элемент массива [ebx] с максимальным edx. Если он максимальный, то переходим на метку newValues
  33.  
  34.  jl newValues
  35.  mov edi , [index]
  36.  
  37. newValues:
  38.  add ebx , 4 ; Вычисляем адрес следующего элемента
  39.  inc dword [index] ; Увеличиваем индекс
  40.  
  41. loop doIteration
  42.  mov dl, [eax + edi*4]
  43.  mov [max], dl
  44.  mov dl, [eax, + esi*4]
  45.  mov [min], dl
  46.  
  47.  ;Выведем получившийся массив
  48.  mov eax,1 ; counter
  49.  mov edx, arr ; адресс первого элемента массива
  50.  mov ecx, [size] ; размер массива
  51.  mov bl, '0'
  52.  mov [fl], bl ; Устанавливаем значение флага в 0
  53. whileStart:
  54.  cmp eax, ecx
  55.  jg whileEnd ; если прошлись по всему массиву, то прыгаем на whileEnd
  56.  inc eax ; eax++
  57.  push eax
  58.  push ecx
  59.  
  60.  
  61.  mov cl,[edx]
  62.  add edx, 4 ; прибавляем 4 к указателю
  63.  mov [simvol], cl ; получаем текущий элемент массива
  64.  push edx
  65.  
  66.  ; Если текущий символ это минимальный или максимальный то прыгаем на set_flag
  67.  mov dl, [min]
  68.  cmp cl, dl
  69.  je set_flag
  70.  mov dl, [max]
  71.  cmp cl, dl
  72.  je set_flag
  73.  jmp endif
  74.  
  75. ;Прибавляем 1 к fl и прыгаем на print
  76.  set_flag:  
  77.  mov bl, [fl]
  78.  inc bl
  79.  mov [fl], bl
  80.  jmp print
  81.  
  82.  endif:
  83.  mov bl, [fl]
  84.  cmp bl, '1'  ; Если fl == 1, то выводим 0, иначе элемент массива
  85.  je print_zero
  86.  jmp print
  87.  
  88.  ; Выводим 0
  89. print_zero:
  90.  mov eax,4
  91.  mov ecx, n
  92.  mov ebx,1
  93.  mov edx,1
  94.  int 0x80
  95.  jmp next5
  96.  ; Выводим элемент массива
  97. print:
  98.  mov eax,4
  99.  mov ecx, simvol
  100.  mov ebx,1
  101.  mov edx,1
  102.  int 0x80
  103.  ; Выводим разделитель
  104. next5:
  105.  mov eax,4
  106.  mov ecx, separator
  107.  mov ebx,1
  108.  mov edx,1
  109.  int 0x80
  110.  
  111.  pop edx
  112.  pop ecx
  113.  pop eax
  114.  jmp whileStart ; Прыгаем в начало цикла
  115.  
  116.  ; Выходим из программы
  117. whileEnd:
  118.  mov eax, 1
  119.  int 0x80
  120.  
  121. section .data
  122.  index dd 0 ; Индекс текущего элемента
  123.  ;Варианты массивов
  124.  arr dd '1','4','4','3','9','5','1','2','2', '4', '3'
  125.  ;arr dd '1','2','3','1','2','3','1','2','3'
  126.  ;arr dd '1','1','1','1','1','1','1','1','1'
  127.  simvol dd 0
  128.  separator db ','
  129.  newLine db 0
  130.  size dd 9 ;Количество элементов в массиве
  131.  n db '0'
  132.  max db '0'
  133.  min db '0'
  134.  
  135. section .bss
  136.  fl resb 1
  137.  
Add Comment
Please, Sign In to add comment