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.  
  24. ; Вывод приглашения
  25. mov eax, 4
  26. mov ebx, 1
  27. mov edx, 21
  28. int 0x80
  29.  
  30. ; Ввод строки
  31. mov eax, 3
  32. mov ebx, 0
  33. mov ecx, buffer
  34. mov edx, 32
  35. int 0x80
  36.  
  37. ; Преобразование строки в число
  38. mov esi, buffer
  39. xor eax, eax
  40. xor ebx, ebx
  41. mov ecx, 10
  42. xor edx, edx ; флаг знака
  43.  
  44. ; Проверка на знак минус
  45. cmp byte [esi], '-'
  46. jne .parse_loop
  47. inc edx ; установить флаг отрицательного
  48. inc esi ; пропустить минус
  49.  
  50. .parse_loop:
  51. mov bl, [esi]
  52. cmp bl, 0xA ; конец строки (LF)
  53. je .finish
  54. cmp bl, 0xD ; конец строки (CR)
  55. je .finish
  56. cmp bl, '0'
  57. jb .finish
  58. cmp bl, '9'
  59. ja .finish
  60.  
  61. sub bl, '0'
  62. imul ecx ; eax = eax * 10
  63. add eax, ebx
  64. inc esi
  65. jmp .parse_loop
  66.  
  67. .finish:
  68. ; Применяем знак если нужно
  69. test edx, edx
  70. jz .done
  71. neg eax
  72.  
  73. .done:
  74. pop esi
  75. pop edx
  76. pop ecx
  77. pop ebx
  78. ret
  79.  
  80. ; Процедура вывода числа из EAX
  81. output_number:
  82. push eax
  83. push ebx
  84. push ecx
  85. push edx
  86. push esi
  87.  
  88. mov esi, buffer + 31
  89. mov byte [esi], 0
  90. dec esi
  91. mov byte [esi], 0xA
  92. dec esi
  93.  
  94. mov ecx, 10
  95. test eax, eax
  96. jns .positive
  97.  
  98. ; Отрицательное число
  99. neg eax
  100. mov byte [esi], '-'
  101. dec esi
  102.  
  103. .positive:
  104. xor edx, edx
  105. div ecx
  106. add dl, '0'
  107. mov [esi], dl
  108. dec esi
  109. test eax, eax
  110. jnz .positive
  111.  
  112. ; Вывод строки
  113. inc esi
  114. mov ecx, esi
  115. mov edx, buffer + 32
  116. sub edx, esi
  117.  
  118. mov eax, 4
  119. mov ebx, 1
  120. int 0x80
  121.  
  122. pop esi
  123. pop edx
  124. pop ecx
  125. pop ebx
  126. pop eax
  127. ret
  128.  
  129. _start:
  130. ; Ввод первого числа
  131. call input_number
  132. mov [num1], eax
  133.  
  134. ; Ввод второго числа
  135. call input_number
  136. mov [num2], eax
  137.  
  138. ; Сложение чисел
  139. mov eax, [num1]
  140. add eax, [num2]
  141. mov [sum], eax
  142.  
  143. ; Вывод результата
  144. mov ecx, result
  145. mov edx, 11
  146. mov eax, 4
  147. mov ebx, 1
  148. int 0x80
  149.  
  150. mov eax, [sum]
  151. call output_number
  152.  
  153. ; Вывод новой строки
  154. mov ecx, newline
  155. mov edx, 2
  156. mov eax, 4
  157. mov ebx, 1
  158. int 0x80
  159.  
  160. ; Завершение программы
  161. mov eax, 1
  162. xor ebx, ebx
  163. int 0x80
Success #stdin #stdout 0.01s 5308KB
stdin
22
22
stdout
Резул�44