fork download
  1. section .data
  2. ; Пример N-байтного числа (8 байт = 64 бита)
  3. ; Число: 123456789012345 (десятичное) = 0x7048860DDF79
  4. big_number dq 44
  5.  
  6. ; Делитель (1 байт)
  7. divisor db 2
  8.  
  9. ; Формат вывода
  10. result_msg db "Результат деления: ", 0
  11. newline db 10, 0
  12.  
  13. section .bss
  14. result resq 1 ; Для хранения результата (64-бит)
  15. remainder resb 1 ; Для хранения остатка
  16.  
  17. ; Буфер для преобразования числа в строку
  18. buffer resb 20 ; Достаточно для 64-битного числа
  19.  
  20. section .text
  21. global _start
  22.  
  23. _start:
  24. ; ========== ДЕЛЕНИЕ N-БАЙТНОГО ЧИСЛА ==========
  25. ; Делим 64-битное число (big_number) на 8-битный делитель
  26.  
  27. ; Загружаем 64-битное число в RDX:RAX для деления
  28. xor rdx, rdx ; Очищаем RDX (старшую часть)
  29. mov rax, [big_number] ; Загружаем число в RAX
  30.  
  31. ; Делитель должен быть в регистре или памяти
  32. movzx rbx, byte [divisor] ; Загружаем делитель с нулевым расширением
  33.  
  34. ; Выполняем деление RDX:RAX / RBX
  35. div rbx ; RAX = частное, RDX = остаток
  36.  
  37. ; Сохраняем результат
  38. mov [result], rax ; Сохраняем частное
  39. mov [remainder], dl ; Сохраняем остаток (младший байт RDX)
  40.  
  41. ; ========== ВЫВОД СООБЩЕНИЯ ==========
  42. mov rsi, result_msg
  43. call print_string
  44.  
  45. ; ========== ПРЕОБРАЗОВАНИЕ ЧИСЛА В СТРОКУ ==========
  46. mov rax, [result] ; Загружаем результат для преобразования
  47. mov rdi, buffer ; Указываем на буфер
  48. call int_to_string ; Преобразуем число в строку
  49.  
  50. ; ========== ВЫВОД РЕЗУЛЬТАТА ==========
  51. mov rsi, buffer ; Указатель на строку с результатом
  52. call print_string
  53.  
  54. ; Вывод перевода строки
  55. mov rsi, newline
  56. call print_string
  57.  
  58. ; ========== ВЫХОД ИЗ ПРОГРАММЫ ==========
  59. mov rax, 60 ; sys_exit
  60. xor rdi, rdi ; код возврата 0
  61. syscall
  62.  
  63. ; ========== ПРОЦЕДУРА ПРЕОБРАЗОВАНИЯ ЧИСЛА В СТРОКУ ==========
  64. ; Вход: RAX - число для преобразования
  65. ; RDI - указатель на буфер
  66. ; Выход: RDI - указатель на конец строки
  67. int_to_string:
  68. push rbx
  69. push rdx
  70. push rdi
  71.  
  72. mov rbx, 10 ; Основание системы счисления (десятичная)
  73. lea rdi, [rdi + 19] ; Переходим в конец буфера
  74. mov byte [rdi], 0 ; Нуль-терминатор строки
  75. dec rdi
  76.  
  77. .convert_loop:
  78. xor rdx, rdx ; Очищаем RDX для деления
  79. div rbx ; RDX = остаток, RAX = частное
  80.  
  81. add dl, '0' ; Преобразуем цифру в символ
  82. mov [rdi], dl ; Сохраняем символ
  83. dec rdi ; Перемещаемся назад по буферу
  84.  
  85. test rax, rax ; Проверяем, закончилось ли число
  86. jnz .convert_loop ; Если не ноль, продолжаем
  87.  
  88. ; Корректируем указатель
  89. inc rdi ; Возвращаемся к первому символу
  90.  
  91. pop rax ; Получаем оригинальный RDI
  92. push rdi
  93.  
  94. ; Копируем строку в правильную позицию
  95. .copy_loop:
  96. mov dl, [rdi]
  97. mov [rax], dl
  98. inc rdi
  99. inc rax
  100. test dl, dl
  101. jnz .copy_loop
  102.  
  103. pop rdi
  104. pop rdx
  105. pop rbx
  106. ret
  107.  
  108. ; ========== ПРОЦЕДУРА ВЫВОДА СТРОКИ ==========
  109. ; Вход: RSI - указатель на строку (завершается нулем)
  110. print_string:
  111. push rax
  112. push rdi
  113. push rdx
  114.  
  115. ; Вычисляем длину строки
  116. mov rdi, rsi
  117. xor rcx, rcx
  118. not rcx
  119. xor al, al
  120. cld
  121. repne scasb
  122. not rcx
  123. dec rcx
  124.  
  125. ; Вывод строки
  126. mov rax, 1 ; sys_write
  127. mov rdi, 1 ; stdout
  128. mov rdx, rcx ; длина строки
  129. syscall
  130.  
  131. pop rdx
  132. pop rdi
  133. pop rax
  134. ret
Success #stdin #stdout 0s 5324KB
stdin
Standard input is empty
stdout
Результат деления: 22