fork download
  1. section .data
  2. numbers dq 10, 25, 17, 8, 45, 33, 2, 29, 50, 15
  3. a dq 10
  4. b dq 40
  5. minVal dq 0x7FFFFFFFFFFFFFFF
  6. maxVal dq 0
  7. found db 0
  8.  
  9. msgMin db "Min: ", 0
  10. msgMax db "Max: ", 0
  11. msgNone db "No values in range (a, b).", 10, 0
  12.  
  13. section .bss
  14. numBuffer resb 20 ; Буфер для числа у вигляді рядка
  15.  
  16. section .text
  17. global _start
  18.  
  19. _start:
  20. xor rcx, rcx ; index = 0
  21.  
  22. .loop:
  23. cmp rcx, 10
  24. jge .done_check
  25.  
  26. mov rax, [numbers + rcx*8] ; отримуємо поточне число
  27.  
  28. mov rbx, [a]
  29. cmp rax, rbx
  30. jle .next
  31.  
  32. mov rbx, [b]
  33. cmp rax, rbx
  34. jge .next
  35.  
  36. ; знайдено валідне число
  37. mov byte [found], 1
  38.  
  39. ; оновлення мінімуму
  40. mov rbx, [minVal]
  41. cmp rax, rbx
  42. jge .skip_min
  43. mov [minVal], rax
  44. .skip_min:
  45.  
  46. ; оновлення максимуму
  47. mov rbx, [maxVal]
  48. cmp rax, rbx
  49. jle .skip_max
  50. mov [maxVal], rax
  51. .skip_max:
  52.  
  53. .next:
  54. inc rcx
  55. jmp .loop
  56.  
  57. .done_check:
  58. cmp byte [found], 0
  59. je .print_none
  60.  
  61. ; друк мінімуму
  62. mov rdi, msgMin
  63. call print_string
  64. mov rsi, [minVal]
  65. call print_number
  66.  
  67. ; друк максимуму
  68. mov rdi, msgMax
  69. call print_string
  70. mov rsi, [maxVal]
  71. call print_number
  72.  
  73. jmp .exit
  74.  
  75. .print_none:
  76. mov rdi, msgNone
  77. call print_string
  78.  
  79. mov rax, 60 ; syscall: exit
  80. xor rdi, rdi ; статус 0
  81. syscall
  82.  
  83. ; -------------------
  84. ; print_string - вивести рядок
  85. ; -------------------
  86. print_string:
  87. mov rax, 1 ; syscall: sys_write
  88. mov rdi, 1 ; file descriptor (stdout)
  89. mov rdx, 100 ; максимальна довжина (завжди більше за реальний розмір)
  90. syscall
  91. ret
  92.  
  93. ; -------------------
  94. ; print_number - вивести число (перетворити на рядок)
  95. ; -------------------
  96. print_number:
  97. ; Тут потрібно перевести число в рядок
  98. ; Переведемо число в десятковий рядок
  99. mov rax, rsi ; отримуємо число для виведення
  100. mov rcx, 10 ; основа для ділення (десяткова)
  101. mov rbx, numBuffer ; буфер для збереження цифр
  102. add rbx, 19 ; ставимо кінець буфера
  103. mov byte [rbx], 0 ; термінатор рядка
  104.  
  105. reverse_loop:
  106. dec rbx ; переміщаємо до місця для зберігання цифри
  107. xor rdx, rdx ; очищаємо rdx
  108. div rcx ; ділимо rax на 10, залишок буде в rdx
  109. add dl, '0' ; перетворюємо залишок в ASCII
  110. mov [rbx], dl ; зберігаємо цифру
  111. test rax, rax ; перевіряємо, чи залишилося число
  112. jnz reverse_loop
  113.  
  114. ; вивести рядок
  115. mov rdi, rbx ; вказуємо на початок рядка
  116. call print_string
  117. ret
  118.  
  119.  
Success #stdin #stdout 0.01s 5292KB
stdin
Standard input is empty
stdout
Standard output is empty