fork download
  1. section .data
  2. ; Данные для примера: два 4-байтовых числа (dword)
  3. num1 dd -22 ; Первое число со знаком (размер: 4 байта)
  4. num2 dd 1 ; Второе число со знаком (размер: 4 байта)
  5. result dq 0 ; Здесь будет результат (8 байт, чтобы вместить произведение)
  6.  
  7. ; Строки для вывода
  8. msg db "Результат умножения: ", 0
  9. newline db 10 ; Символ новой строки (ASCII 10 = '\n')
  10. buffer times 20 db 0 ; Буфер для преобразования числа в строку
  11. buf_end equ $ ; Конец буфера
  12.  
  13. section .bss
  14. ; (Не используется в этом примере)
  15.  
  16. section .text
  17. global _start
  18.  
  19. _start:
  20. ; 1. Умножение двух 4-байтовых чисел со знаком
  21. mov eax, [num1] ; Загружаем первое число в eax
  22. imul dword [num2] ; Умножаем eax на второе число (знаковое умножение)
  23. ; Результат (64-битный) теперь в edx:eax (старшая и младшая части)
  24.  
  25. ; Сохраняем результат в переменную result (как 64-битное число)
  26. mov [result], rax ; Сохраняем младшую часть (в x86_64 rax = eax с нулевым расширением)
  27.  
  28. ; 2. Выводим сообщение "Результат умножения: "
  29. mov rax, 1 ; Системный вызов sys_write
  30. mov rdi, 1 ; Файловый дескриптор stdout
  31. mov rsi, msg ; Адрес строки
  32. mov rdx, 20 ; Длина строки (подсчитайте точную длину вашей строки)
  33. syscall
  34.  
  35. ; 3. Преобразуем результат (64-битное число в rax) в строку ASCII
  36. mov rax, [result] ; Загружаем результат в rax
  37. mov rdi, buffer ; Указываем на конец буфера (преобразуем с конца)
  38. add rdi, 19 ; Перемещаемся к последнему байту буфера
  39. mov byte [rdi], 0 ; Записываем нулевой терминатор для строки
  40. mov rbx, 10 ; Делитель для преобразования в десятичную строку
  41.  
  42. ; Проверяем знак числа
  43. test rax, rax
  44. jns .convert_loop ; Если число положительное, переходим к преобразованию
  45. neg rax ; Если отрицательное, делаем его положительным для обработки
  46.  
  47. .convert_loop:
  48. xor rdx, rdx ; Обнуляем rdx перед делением
  49. div rbx ; Делим rax на 10, остаток в rdx
  50. add dl, '0' ; Преобразуем цифру в символ ASCII
  51. dec rdi ; Двигаемся назад в буфере
  52. mov [rdi], dl ; Сохраняем символ
  53. test rax, rax
  54. jnz .convert_loop ; Продолжаем, пока rax != 0
  55.  
  56. ; Если исходное число было отрицательным, добавляем знак минус
  57. mov rax, [result]
  58. test rax, rax
  59. jns .print
  60. dec rdi
  61. mov byte [rdi], '-'
  62.  
  63. .print:
  64. ; 4. Выводим преобразованное число (строка начинается с rdi)
  65. mov rsi, rdi ; Адрес начала строки
  66. mov rdx, buf_end ; Вычисляем длину строки: конец буфера - текущая позиция
  67. sub rdx, rdi
  68. mov rax, 1 ; sys_write
  69. mov rdi, 1 ; stdout
  70. syscall
  71.  
  72. ; 5. Выводим символ новой строки
  73. mov rax, 1
  74. mov rdi, 1
  75. mov rsi, newline
  76. mov rdx, 1
  77. syscall
  78.  
  79. ; 6. Завершаем программу
  80. mov rax, 60 ; Системный вызов sys_exit
  81. xor rdi, rdi ; Код возврата 0
  82. syscall
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
Результат �4294967274