fork download
  1. section .data
  2. ; Масив 64-бітних чисел
  3. array dq 120, 5, 45, 10, 2, 8, 300, 15, 1, 99
  4. ; Довжина масиву
  5. len equ ($ - array) / 8
  6.  
  7. section .bss
  8. ; Буфер для рядка (20 цифр + знак + перехід рядка)
  9. buffer resb 24
  10.  
  11. section .text
  12. global _start
  13.  
  14. _start:
  15. ; --- 1. Сортування ---
  16. mov rdi, array
  17. mov rsi, len
  18. call SortProcedure
  19.  
  20. ; --- 2. Виведення ---
  21. mov rbx, array ; Вказівник на поточний елемент
  22. mov r12, len ; Лічильник (R12 зберігається між викликами syscall)
  23.  
  24. PrintLoop:
  25. mov rax, [rbx] ; Завантажуємо число
  26. call PrintNumber ; Друкуємо
  27.  
  28. add rbx, 8 ; Наступний елемент (8 байт)
  29. dec r12
  30. jnz PrintLoop
  31.  
  32. ; --- 3. Вихід ---
  33. mov rax, 60 ; sys_exit
  34. xor rdi, rdi ; код 0
  35. syscall
  36.  
  37. ; ---------------------------------------------------------
  38. ; Процедура друку числа (RAX -> stdout)
  39. ; ---------------------------------------------------------
  40. PrintNumber:
  41. push rbx
  42. push rcx
  43. push rdx
  44. push rsi
  45. push rdi
  46. push r11
  47.  
  48. mov rsi, buffer + 23 ; Кінець буфера
  49. mov byte [rsi], 10 ; Символ нового рядка \n
  50. mov rbx, 10 ; Дільник
  51.  
  52. .convert_loop:
  53. xor rdx, rdx ; Очищення для ділення
  54. div rbx ; RAX / 10
  55. add dl, '0' ; Цифра -> ASCII
  56. dec rsi
  57. mov [rsi], dl
  58. test rax, rax
  59. jnz .convert_loop
  60.  
  61. ; Виведення (sys_write)
  62. mov rax, 1 ; sys_write
  63. mov rdi, 1 ; stdout
  64. lea rdx, [buffer + 24] ; Кінець буфера
  65. sub rdx, rsi ; Довжина = Кінець - Початок
  66. syscall
  67.  
  68. pop r11
  69. pop rdi
  70. pop rsi
  71. pop rdx
  72. pop rcx
  73. pop rbx
  74. ret
  75.  
  76. ; ---------------------------------------------------------
  77. ; Процедура сортування (Bubble Sort)
  78. ; RDI = адреса, RSI = довжина
  79. ; ---------------------------------------------------------
  80. SortProcedure:
  81. push rbx
  82. push rcx
  83. push rdx
  84.  
  85. mov rcx, rsi
  86. dec rcx ; N-1 ітерацій
  87.  
  88. .outer_loop:
  89. push rcx
  90. mov rbx, rdi ; Скидаємо вказівник на початок
  91.  
  92. .inner_loop:
  93. mov rax, [rbx]
  94. cmp rax, [rbx+8] ; Порівняння з наступним
  95. jle .no_swap
  96.  
  97. xchg rax, [rbx+8] ; Обмін
  98. mov [rbx], rax
  99.  
  100. .no_swap:
  101. add rbx, 8
  102. loop .inner_loop
  103.  
  104. pop rcx
  105. loop .outer_loop
  106.  
  107. pop rdx
  108. pop rcx
  109. pop rbx
  110. ret
Success #stdin #stdout 0s 5316KB
stdin
Standard input is empty
stdout
1
2
5
8
10
15
45
99
120
300