fork download
  1. section .data
  2. ; Використовуємо 64-бітні числа (dq = 8 байт)
  3. SourceArray dq 120, 5, 45, 10, 2, 8, 300, 15, 1, 99
  4. ; Обчислення довжини: (поточна адреса - початок) / 8 байт
  5. ArrayLen equ ($ - SourceArray) / 8
  6.  
  7. section .text
  8. global _start
  9.  
  10. _start:
  11. ; --- Підготовка аргументів для процедури ---
  12. ; За конвенцією Linux x64 (System V ABI):
  13. ; RDI = 1-й аргумент (Адреса масиву)
  14. ; RSI = 2-й аргумент (Кількість елементів)
  15.  
  16. mov rdi, SourceArray
  17. mov rsi, ArrayLen
  18.  
  19. call SortProcedure
  20.  
  21. ; --- Завершення програми (sys_exit) ---
  22. mov rax, 60 ; Номер системного виклику sys_exit = 60
  23. xor rdi, rdi ; Код повернення 0 (успіх)
  24. syscall
  25.  
  26. ; ---------------------------------------------
  27. ; Процедура сортування Bubble Sort
  28. ; Вхід: RDI = адреса масиву, RSI = довжина
  29. ; ---------------------------------------------
  30. SortProcedure:
  31. ; Збереження регістрів, які ми будемо змінювати (згідно ABI RBX зберігається callee)
  32. push rbx
  33. push rcx
  34. push rdx
  35.  
  36. mov rcx, rsi ; RCX = лічильник зовнішнього циклу (довжина)
  37.  
  38. cmp rcx, 1 ; Якщо елементів <= 1, виходимо
  39. jle DoneSort
  40.  
  41. dec rcx ; N - 1 проходів
  42.  
  43. OuterLoop:
  44. push rcx ; Зберігаємо лічильник зовнішнього циклу
  45.  
  46. mov rbx, rdi ; RBX = копія адреси початку масиву
  47. ; Ми будемо рухати RBX, а RDI хай лишається базою
  48.  
  49. InnerLoop:
  50. mov rax, [rbx] ; Завантажуємо поточне число (8 байт)
  51. cmp rax, [rbx+8] ; Порівнюємо з наступним (зсув +8, бо 64 біти)
  52. jle NoSwap ; Якщо порядок правильний, пропускаємо
  53.  
  54. ; Обмін (Swap)
  55. xchg rax, [rbx+8] ; Міняємо місцями
  56. mov [rbx], rax
  57.  
  58. NoSwap:
  59. add rbx, 8 ; Переходимо до наступного елемента (+8 байт)
  60. loop InnerLoop ; dec rcx, if rcx != 0 goto InnerLoop
  61.  
  62. pop rcx ; Відновлюємо зовнішній лічильник
  63. loop OuterLoop ; Перехід на наступну ітерацію зовнішнього циклу
  64.  
  65. DoneSort:
  66. ; Відновлення регістрів
  67. pop rdx
  68. pop rcx
  69. pop rbx
  70. ret
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
Standard output is empty