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