fork download
  1. section .data
  2. prompt1 db "Введите первое число: ", 0
  3. prompt2 db "Введите второе число: ", 0
  4. result db "Результат: ", 0
  5. newline db 0xA, 0
  6. buffer times 32 db 0
  7. minus db '-', 0
  8.  
  9. section .bss
  10. num1 resd 1
  11. num2 resd 1
  12. sum resd 1
  13. output_buf resb 12
  14.  
  15. section .text
  16. global _start
  17.  
  18. ; Вывод строки
  19. ; ECX = адрес строки
  20. print_string:
  21. push eax
  22. push ebx
  23. push edx
  24. push ecx
  25.  
  26. ; Находим длину строки
  27. mov edx, 0
  28. .find_length:
  29. cmp byte [ecx + edx], 0
  30. je .print
  31. inc edx
  32. jmp .find_length
  33.  
  34. .print:
  35. mov eax, 4
  36. mov ebx, 1
  37. int 0x80
  38.  
  39. pop ecx
  40. pop edx
  41. pop ebx
  42. pop eax
  43. ret
  44.  
  45. ; Ввод числа (возвращает в EAX)
  46. input_number:
  47. push ebx
  48. push ecx
  49. push edx
  50. push esi
  51.  
  52. ; Чтение строки
  53. mov eax, 3
  54. mov ebx, 0
  55. mov ecx, buffer
  56. mov edx, 32
  57. int 0x80
  58.  
  59. ; Преобразование строки в число
  60. mov esi, buffer
  61. xor eax, eax
  62. xor ebx, ebx
  63. xor ecx, ecx
  64. xor edx, edx
  65.  
  66. ; Проверка знака
  67. mov bl, [esi]
  68. cmp bl, '-'
  69. jne .positive
  70. inc edx ; флаг отрицательного
  71. inc esi
  72. jmp .next_char
  73.  
  74. .positive:
  75. cmp bl, '+'
  76. jne .next_char
  77. inc esi
  78.  
  79. .next_char:
  80. mov bl, [esi]
  81. cmp bl, 0xA ; конец строки
  82. je .done
  83. cmp bl, 0xD ; конец строки
  84. je .done
  85. cmp bl, ' '
  86. je .done
  87.  
  88. sub bl, '0'
  89. imul eax, 10
  90. add eax, ebx
  91. inc esi
  92. jmp .next_char
  93.  
  94. .done:
  95. ; Применяем знак
  96. test edx, edx
  97. jz .exit
  98. neg eax
  99.  
  100. .exit:
  101. pop esi
  102. pop edx
  103. pop ecx
  104. pop ebx
  105. ret
  106.  
  107. ; Вывод числа из EAX
  108. output_number:
  109. push eax
  110. push ebx
  111. push ecx
  112. push edx
  113. push esi
  114. push edi
  115.  
  116. mov edi, output_buf + 11
  117. mov byte [edi], 0
  118. dec edi
  119. mov byte [edi], 0xA
  120.  
  121. mov ecx, 10
  122. test eax, eax
  123. jns .convert
  124.  
  125. ; Отрицательное число
  126. neg eax
  127. push eax
  128. mov eax, 4
  129. mov ebx, 1
  130. mov ecx, minus
  131. mov edx, 1
  132. int 0x80
  133. pop eax
  134.  
  135. .convert:
  136. xor edx, edx
  137. div ecx
  138. add dl, '0'
  139. mov [edi], dl
  140. dec edi
  141. test eax, eax
  142. jnz .convert
  143.  
  144. ; Вывод результата
  145. inc edi
  146. mov ecx, edi
  147.  
  148. ; Находим длину
  149. mov esi, edi
  150. xor edx, edx
  151. .count:
  152. cmp byte [esi], 0
  153. je .print
  154. inc esi
  155. inc edx
  156. jmp .count
  157.  
  158. .print:
  159. mov eax, 4
  160. mov ebx, 1
  161. int 0x80
  162.  
  163. pop edi
  164. pop esi
  165. pop edx
  166. pop ecx
  167. pop ebx
  168. pop eax
  169. ret
  170.  
  171. _start:
  172. ; Первое число
  173. mov ecx, prompt1
  174. call print_string
  175. call input_number
  176. mov [num1], eax
  177.  
  178. ; Второе число
  179. mov ecx, prompt2
  180. call print_string
  181. call input_number
  182. mov [num2], eax
  183.  
  184. ; Сложение
  185. mov eax, [num1]
  186. add eax, [num2]
  187. mov [sum], eax
  188.  
  189. ; Вывод результата
  190. mov ecx, result
  191. call print_string
  192. mov eax, [sum]
  193. call output_number
  194.  
  195. ; Новая строка
  196. mov ecx, newline
  197. call print_string
  198.  
  199. ; Выход
  200. mov eax, 1
  201. xor ebx, ebx
  202. int 0x80
Success #stdin #stdout 0.01s 5292KB
stdin
33
2
stdout
Введите первое число: Введите второе число: Результат: 66