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