fork download
  1. section .data
  2. X4 dd 4 ; Значение X4
  3. X5 dd 5 ; Значение X5
  4. X8 dd 8 ; Значение X8
  5. X2 dd 2 ; Значение X2
  6. X6 dd 6 ; Значение X6
  7. X1 dd 1 ; Значение X1
  8. X3 dd 3 ; Значение X3
  9. result dd 0 ; Переменная для хранения результата
  10. msg db "Result: ", 0 ; Префикс для вывода
  11. msg_len equ $ - msg ; Длина префикса
  12.  
  13. section .bss
  14. buf resb 12 ; Буфер для строки результата (максимум 11 символов + \0)
  15.  
  16. section .text
  17. global _start
  18.  
  19. _start:
  20. ; Загружаем значения X4, X5, X8 и суммируем
  21. mov eax, dword [X4] ; eax = X4
  22. add eax, dword [X5] ; eax = X4 + X5
  23. add eax, dword [X8] ; eax = X4 + X5 + X8
  24.  
  25. ; Загружаем значения X2, X6 и суммируем
  26. mov ebx, dword [X2] ; ebx = X2
  27. add ebx, dword [X6] ; ebx = X2 + X6
  28.  
  29. ; Перемножаем результаты
  30. imul eax, ebx ; eax = (X4 + X5 + X8) * (X2 + X6)
  31.  
  32. ; Выполняем XOR с X1 и X3
  33. xor eax, dword [X1] ; eax = eax ⊕ X1
  34. xor eax, dword [X3] ; eax = eax ⊕ X3
  35.  
  36. ; Сохраняем результат в памяти
  37. mov dword [result], eax
  38.  
  39. ; Преобразуем результат в строку (itoa)
  40. mov ecx, buf ; Указываем буфер для строки
  41. call int_to_ascii ; Преобразуем eax в строку
  42.  
  43. ; Выводим сообщение "Result: "
  44. mov eax, 1 ; syscall write
  45. mov edi, 1 ; stdout
  46. mov rsi, msg ; адрес сообщения
  47. mov edx, msg_len ; длина сообщения
  48. syscall
  49.  
  50. ; Выводим значение результата
  51. mov eax, 1 ; syscall write
  52. mov edi, 1 ; stdout
  53. mov rsi, buf ; адрес результата
  54. mov edx, 12 ; макс. длина строки (результат всегда уместится)
  55. syscall
  56.  
  57. ; Завершаем программу
  58. mov eax, 60 ; syscall exit
  59. xor edi, edi ; Код возврата = 0
  60. syscall
  61.  
  62. ; Процедура преобразования числа в строку (itoa)
  63. int_to_ascii:
  64. xor edx, edx ; Очистить edx для деления
  65. mov ebx, 10 ; Основа системы счисления (10)
  66. convert_loop:
  67. xor edx, edx ; Очистить остаток
  68. div ebx ; edx = eax % 10, eax = eax / 10
  69. add dl, '0' ; Преобразуем цифру в ASCII
  70. dec ecx ; Сдвигаем указатель влево
  71. mov [ecx], dl ; Сохраняем символ в буфере
  72. test eax, eax ; Проверяем, если eax == 0
  73. jnz convert_loop ; Если нет, продолжаем
  74. ret
  75.  
  76.  
Success #stdin #stdout 0s 5284KB
stdin
Standard input is empty
stdout
Result: