fork download
  1. section .data
  2. ; Варіант 19: Масив слів (dw = 2 байти)
  3. SourceArray dw 120, 5, 45, 10, 2, 8, 300, 15, 1, 99
  4.  
  5. ; Рахуємо кількість елементів
  6. ArrayLen equ ($ - SourceArray) / 2
  7.  
  8. section .text
  9. global _start
  10.  
  11. _start:
  12. ; --- ПІДГОТОВКА СТЕКУ ---
  13. ; ВАЖЛИВО: У 64-бітній системі стек працює блоками по 8 байт (qword)
  14.  
  15. push qword ArrayLen ; Параметр 1: Кількість елементів
  16. lea rax, [SourceArray] ; Завантажуємо адресу в 64-бітний регістр RAX
  17. push rax ; Параметр 2: Адреса початку масиву
  18.  
  19. call SortProcedure ; Виклик процедури
  20.  
  21. ; Очищення стеку (2 параметри * 8 байт = 16 байт)
  22. add rsp, 16
  23.  
  24. ; --- ВИХІД З ПРОГРАМИ (Linux syscall 60) ---
  25. mov rax, 60 ; Номер функції sys_exit
  26. xor rdi, rdi ; Код повернення 0
  27. syscall
  28.  
  29. ; =========================================================
  30. ; Процедура сортування (Bubble Sort)
  31. ; Вхідні параметри (через стек):
  32. ; [rbp+16] -> Адреса масиву (64-бітний вказівник)
  33. ; [rbp+24] -> Кількість елементів
  34. ; =========================================================
  35. SortProcedure:
  36. push rbp
  37. mov rbp, rsp
  38.  
  39. ; Зберігаємо регістри, які будемо використовувати
  40. push rbx
  41. push rcx
  42. push rdx
  43. push rsi
  44. push rdi
  45.  
  46. ; Отримуємо параметри зі стеку
  47. mov rbx, [rbp+16] ; RBX = Адреса масиву (ТІЛЬКИ RBX, не BX!)
  48. mov rcx, [rbp+24] ; RCX = Кількість елементів
  49.  
  50. cmp rcx, 1 ; Якщо 1 або 0 елементів - виходимо
  51. jle EndSort
  52. dec rcx ; Кількість проходів = N-1
  53.  
  54. OuterLoop:
  55. push rcx ; Зберігаємо лічильник зовнішнього циклу
  56. mov rsi, rbx ; RSI = Поточна адреса (ТІЛЬКИ RSI, не SI!)
  57.  
  58. InnerLoop:
  59. ; Читаємо слово (2 байти), але адресу беремо з 64-бітного регістра RSI
  60. mov ax, [rsi]
  61. cmp ax, [rsi+2] ; Порівнюємо з наступним словом
  62. jle NoSwap ; Якщо порядок вірний - пропускаємо
  63.  
  64. ; Обмін елементів (Swap)
  65. xchg ax, [rsi+2]
  66. mov [rsi], ax
  67.  
  68. NoSwap:
  69. add rsi, 2 ; Переходимо до наступного слова (+2 байти)
  70. dec rcx ; Зменшуємо лічильник
  71. jnz InnerLoop ; Якщо не нуль, повторюємо
  72.  
  73. pop rcx ; Відновлюємо лічильник зовнішнього циклу
  74. dec rcx
  75. jnz OuterLoop ; Наступний прохід
  76.  
  77. EndSort:
  78. ; Відновлюємо регістри перед виходом
  79. pop rdi
  80. pop rsi
  81. pop rdx
  82. pop rcx
  83. pop rbx
  84.  
  85. pop rbp
  86. ret
Success #stdin #stdout 0s 5308KB
stdin
Standard input is empty
stdout
Standard output is empty