fork download
  1. ; Секция данных (инициализированные данные)
  2. section .data
  3. msg db 'Sum of digits: ', 0 ; Строка сообщения с нуль-терминатором
  4. msg_len equ $ - msg - 1 ; Вычисляем длину сообщения (без учета нуль-терминатора)
  5. ; $ - текущая позиция ассемблера, msg - начало строки
  6. newline db 10 ; Символ новой строки (ASCII 10 = '\n')
  7.  
  8. ; Секция неинициализированных данных (резервирование памяти)
  9. section .bss
  10. buffer resb 12 ; Резервируем 12 байт для буфера вывода числа
  11.  
  12. ; Секция кода
  13. section .text
  14. global _start ; Объявляем точку входа _start как глобальную
  15.  
  16. _start:
  17. ; Инициализация регистров для вычисления суммы цифр
  18. mov eax, 0x12AC8 ; Загружаем наше шестнадцатеричное число в EAX
  19. xor ebx, ebx ; Обнуляем EBX - здесь будем накапливать сумму цифр
  20. mov ecx, 16 ; Загружаем 16 в ECX (основание системы счисления)
  21.  
  22. ; Цикл вычисления суммы цифр
  23. .sum_loop:
  24. test eax, eax ; Проверяем, не стало ли число нулём
  25. jz .print ; Если ноль - переходим к выводу результата
  26.  
  27. xor edx, edx ; Обнуляем EDX (он будет содержать остаток от деления)
  28. div ecx ; Делим EDX:EAX на ECX (16)
  29. ; Результат (частное) в EAX, остаток (цифра) в EDX
  30. add ebx, edx ; Добавляем цифру (EDX) к общей сумме (EBX)
  31. jmp .sum_loop ; Повторяем цикл
  32.  
  33. ; Подготовка к выводу результата
  34. .print:
  35. ; Преобразуем число (сумму цифр) в строку ASCII
  36. lea edi, [buffer+11] ; Загружаем адрес конца буфера (12-й байт) в EDI
  37. mov byte [edi], 0 ; Записываем нуль-терминатор в конец буфера
  38. dec edi ; Перемещаем указатель на предыдущую позицию
  39.  
  40. mov eax, ebx ; Копируем сумму цифр в EAX для преобразования
  41. mov ecx, 10 ; Устанавливаем делитель 10 (для десятичного вывода)
  42.  
  43. ; Цикл преобразования числа в строку
  44. .convert_loop:
  45. xor edx, edx ; Обнуляем EDX перед делением
  46. div ecx ; Делим EDX:EAX на 10
  47. ; Частное в EAX, остаток (цифра) в EDX
  48. add dl, '0' ; Преобразуем цифру (0-9) в ASCII символ
  49. mov [edi], dl ; Сохраняем символ в буфер
  50. dec edi ; Перемещаем указатель назад
  51.  
  52. test eax, eax ; Проверяем, осталось ли что-то для преобразования
  53. jnz .convert_loop ; Если да, продолжаем цикл
  54.  
  55. ; Вывод сообщения "Sum of digits: "
  56. mov eax, 4 ; Номер системного вызова sys_write (4)
  57. mov ebx, 1 ; Файловый дескриптор stdout (1)
  58. mov ecx, msg ; Указатель на начало сообщения
  59. mov edx, msg_len ; Длина сообщения
  60. int 0x80 ; Вызов ядра Linux
  61.  
  62. ; Вывод самого числа (суммы цифр)
  63. mov eax, 4 ; sys_write
  64. mov ebx, 1 ; stdout
  65. lea ecx, [edi+1] ; Указатель на начало числа в буфере
  66. lea edx, [buffer+12] ; Указатель на конец буфера
  67. sub edx, ecx ; Вычисляем длину строки (конец - начало)
  68. int 0x80 ; Вызов ядра
  69.  
  70. ; Вывод символа новой строки
  71. mov eax, 4 ; sys_write
  72. mov ebx, 1 ; stdout
  73. mov ecx, newline ; Указатель на символ новой строки
  74. mov edx, 1 ; Длина 1 байт
  75. int 0x80 ; Вызов ядра
  76.  
  77. ; Завершение программы
  78. mov eax, 1 ; Номер системного вызова sys_exit (1)
  79. xor ebx, ebx ; Код возврата 0 (успешное завершение)
  80. int 0x80 ; Вызов ядра
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Sum of digits: 33