fork download
  1. section .data
  2. ; Варіант 19: Масив слів
  3. SourceArray dw 120, 5, 45, 10, 2, 8, 300, 15, 1, 99
  4. ArrayLen equ ($ - SourceArray) / 2
  5.  
  6. ; Символ нового рядка для виводу
  7. newline db 10
  8.  
  9. section .bss
  10. ; Буфер для зберігання текстового вигляду числа (макс 6 цифр для 16-біт)
  11. numBuffer resb 10
  12.  
  13. section .text
  14. global _start
  15.  
  16. _start:
  17. ; --- 1. СОРТУВАННЯ (Bubble Sort) ---
  18. push qword ArrayLen ; Параметр 1: Кількість
  19. lea rax, [SourceArray] ; Параметр 2: Адреса
  20. push rax
  21.  
  22. call SortProcedure ; Сортуємо
  23. add rsp, 16 ; Чистимо стек параметрів
  24.  
  25. ; --- 2. ВИВІД РЕЗУЛЬТАТУ ---
  26. ; Підготовка циклу для друку
  27. mov cx, ArrayLen ; Лічильник (кількість чисел)
  28. lea rsi, [SourceArray] ; Вказівник на початок масиву
  29.  
  30. PrintLoop:
  31. push rcx ; Зберігаємо лічильник циклу
  32. push rsi ; Зберігаємо вказівник на поточне число
  33.  
  34. ; Беремо число з масиву (тільки 2 байти)
  35. xor rax, rax ; Очищаємо rax
  36. mov ax, [rsi] ; Завантажуємо число
  37.  
  38. ; Викликаємо процедуру друку числа (вона в rax)
  39. call PrintNumber
  40.  
  41. ; Друкуємо перенос рядка (щоб числа були в стовпчик)
  42. mov rax, 1 ; sys_write
  43. mov rdi, 1 ; stdout
  44. lea rsi, [newline] ; адреса символу \n
  45. mov rdx, 1 ; довжина 1 байт
  46. syscall
  47.  
  48. pop rsi ; Відновлюємо вказівник
  49. pop rcx ; Відновлюємо лічильник
  50.  
  51. add rsi, 2 ; Переходимо до наступного числа (+2 байти)
  52. dec cx ; Зменшуємо лічильник
  53. jnz PrintLoop ; Якщо не 0, повторюємо
  54.  
  55. ; --- 3. ЗАВЕРШЕННЯ ---
  56. mov rax, 60 ; sys_exit
  57. xor rdi, rdi
  58. syscall
  59.  
  60. ; =========================================================
  61. ; Процедура: SortProcedure (Bubble Sort)
  62. ; =========================================================
  63. SortProcedure:
  64. push rbp
  65. mov rbp, rsp
  66. push rbx
  67. push rcx
  68. push rdx
  69. push rsi
  70. push rdi
  71.  
  72. mov rbx, [rbp+16] ; Адреса масиву
  73. mov rcx, [rbp+24] ; Кількість елементів
  74.  
  75. cmp rcx, 1
  76. jle EndSort
  77. dec rcx
  78.  
  79. OuterLoop:
  80. push rcx
  81. mov rsi, rbx
  82.  
  83. InnerLoop:
  84. mov ax, [rsi]
  85. cmp ax, [rsi+2]
  86. jle NoSwap
  87.  
  88. xchg ax, [rsi+2]
  89. mov [rsi], ax
  90.  
  91. NoSwap:
  92. add rsi, 2
  93. dec rcx
  94. jnz InnerLoop
  95.  
  96. pop rcx
  97. dec rcx
  98. jnz OuterLoop
  99.  
  100. EndSort:
  101. pop rdi
  102. pop rsi
  103. pop rdx
  104. pop rcx
  105. pop rbx
  106. pop rbp
  107. ret
  108.  
  109. ; =========================================================
  110. ; Процедура: PrintNumber
  111. ; Перетворює число в RAX у рядок і друкує його
  112. ; =========================================================
  113. PrintNumber:
  114. push rbx
  115. push rcx
  116. push rdx
  117. push rsi
  118. push rdi
  119.  
  120. mov rcx, 0 ; Лічильник цифр
  121. mov rbx, 10 ; Дільник = 10
  122.  
  123. DivideLoop:
  124. xor rdx, rdx ; Очищаємо залишок
  125. div rbx ; AX / 10 -> AX=частка, DX=залишок
  126.  
  127. add dl, '0' ; Перетворюємо цифру в ASCII (наприклад, 5 -> '5')
  128. push rdx ; Зберігаємо цифру в стек (бо отримуємо їх з кінця)
  129. inc rcx ; Рахуємо кількість цифр
  130.  
  131. test rax, rax ; Якщо частка 0, кінець
  132. jnz DivideLoop
  133.  
  134. ; Тепер виводимо цифри зі стеку
  135. ; Щоб вивести, треба записати їх у буфер
  136. lea rsi, [numBuffer] ; Адреса буфера
  137. mov rdi, rsi ; Копія адреси для запису
  138.  
  139. PopLoop:
  140. pop rax ; Дістаємо цифру зі стеку
  141. mov [rdi], al ; Записуємо в буфер
  142. inc rdi ; Зсуваємо вказівник буфера
  143. loop PopLoop ; Повторюємо CX разів
  144.  
  145. ; Виклик sys_write для всього буфера
  146. mov rdx, rdi ; Обчислюємо довжину:
  147. lea rax, [numBuffer]
  148. sub rdx, rax ; rdx = поточний rdi - початок буфера (довжина рядка)
  149.  
  150. mov rax, 1 ; sys_write
  151. mov rdi, 1 ; stdout (консоль)
  152. lea rsi, [numBuffer] ; адреса тексту
  153. syscall
  154.  
  155. pop rdi
  156. pop rsi
  157. pop rdx
  158. pop rcx
  159. pop rbx
  160. ret
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
1
2
5
8
10
15
45
99
120
300