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