fork download
  1. section .data
  2. ; 1. Создать переменную с текстом
  3. text db 'Assembler – low level programming', 0
  4. text_len equ $ - text
  5.  
  6. ; 2. Создать переменную со значением 40
  7. var1 dd 40
  8.  
  9. ; 3. Создать переменную со значением 36
  10. var2 dd 36
  11.  
  12. ; Для вывода результатов
  13. result_msg1 db 'Subtraction result: ', 0
  14. result_msg2 db 'Addition result: ', 0
  15. result_msg3 db 'Add immediate result: ', 0
  16. result_msg4 db 'Subtract immediate result: ', 0
  17. newline db 0xA, 0
  18.  
  19. section .bss
  20. ; Буфер для вывода чисел
  21. buffer resb 16
  22.  
  23. section .text
  24. global _start
  25.  
  26. _start:
  27. ; Выводим исходный текст
  28. mov rax, 1 ; sys_write
  29. mov rdi, 1 ; stdout
  30. mov rsi, text ; указатель на текст
  31. mov rdx, text_len ; длина текста
  32. syscall
  33.  
  34. ; Выводим перевод строки
  35. mov rax, 1
  36. mov rdi, 1
  37. mov rsi, newline
  38. mov rdx, 1
  39. syscall
  40.  
  41. ; 4. Вычесть из первой вторую (40 - 36)
  42. mov eax, [var1] ; загружаем var1 в eax
  43. sub eax, [var2] ; вычитаем var2
  44. ; Результат в eax = 4
  45.  
  46. ; Выводим сообщение о вычитании
  47. mov rax, 1
  48. mov rdi, 1
  49. mov rsi, result_msg1
  50. mov rdx, 19
  51. syscall
  52.  
  53. ; Выводим результат вычитания
  54. call print_number
  55.  
  56. ; 5. Сложить первую со второй (40 + 36)
  57. mov eax, [var1] ; загружаем var1
  58. add eax, [var2] ; прибавляем var2
  59. ; Результат в eax = 76
  60.  
  61. ; Выводим сообщение о сложении
  62. mov rax, 1
  63. mov rdi, 1
  64. mov rsi, result_msg2
  65. mov rdx, 17
  66. syscall
  67.  
  68. ; Выводим результат сложения
  69. call print_number
  70.  
  71. ; 6. Сложить любое непосредственное значение с первой переменной
  72. mov eax, [var1] ; загружаем var1 (40)
  73. add eax, 25 ; прибавляем непосредственное значение 25
  74. ; Результат в eax = 65
  75.  
  76. ; Выводим сообщение
  77. mov rax, 1
  78. mov rdi, 1
  79. mov rsi, result_msg3
  80. mov rdx, 22
  81. syscall
  82.  
  83. ; Выводим результат
  84. call print_number
  85.  
  86. ; 7. Вычесть из первой переменной любое непосредственное значение
  87. mov eax, [var1] ; загружаем var1 (40)
  88. sub eax, 15 ; вычитаем непосредственное значение 15
  89. ; Результат в eax = 25
  90.  
  91. ; Выводим сообщение
  92. mov rax, 1
  93. mov rdi, 1
  94. mov rsi, result_msg4
  95. mov rdx, 27
  96. syscall
  97.  
  98. ; Выводим результат
  99. call print_number
  100.  
  101. ; Завершаем программу
  102. mov rax, 60 ; sys_exit
  103. mov rdi, 0 ; код возврата 0
  104. syscall
  105.  
  106. ; Функция для вывода числа из EAX
  107. print_number:
  108. push rax
  109. push rbx
  110. push rcx
  111. push rdx
  112. push rsi
  113.  
  114. mov rsi, buffer + 15 ; конец буфера
  115. mov byte [rsi], 0 ; нулевой терминатор
  116. mov ecx, 10 ; делитель (десятичная система)
  117.  
  118. .convert_loop:
  119. xor edx, edx ; обнуляем edx для деления
  120. div ecx ; eax = eax/10, edx = остаток
  121. add dl, '0' ; преобразуем цифру в символ
  122. dec rsi ; двигаемся назад в буфере
  123. mov [rsi], dl ; сохраняем символ
  124. test eax, eax ; проверяем, не ноль ли eax
  125. jnz .convert_loop ; если не ноль, продолжаем
  126.  
  127. ; Вычисляем длину строки
  128. mov rdx, buffer + 16 ; конец буфера
  129. sub rdx, rsi ; длина = конец - начало
  130.  
  131. ; Выводим число
  132. mov rax, 1 ; sys_write
  133. mov rdi, 1 ; stdout
  134. ; rsi уже указывает на начало строки
  135. ; rdx уже содержит длину
  136. syscall
  137.  
  138. ; Выводим перевод строки
  139. mov rax, 1
  140. mov rdi, 1
  141. mov rsi, newline
  142. mov rdx, 1
  143. syscall
  144.  
  145. pop rsi
  146. pop rdx
  147. pop rcx
  148. pop rbx
  149. pop rax
  150. ret
Success #stdin #stdout 0s 5280KB
stdin
Standard input is empty
stdout
Assembler – low level programming
Subtraction result:19
Addition result: 17
Add immediate result: 22
Subtract immediate result: 27