section .data
prompt1 db "Введите первое число: ", 0
prompt2 db "Введите второе число: ", 0
result db "Результат: ", 0
newline db 0xA, 0
buffer times 32 db 0
minus db '-', 0
section .bss
num1 resd 1
num2 resd 1
sum resd 1
output_buf resb 12
section .text
global _start
; Вывод строки
; ECX = адрес строки
print_string:
push eax
push ebx
push edx
push ecx
; Находим длину строки
mov edx, 0
.find_length:
cmp byte [ecx + edx], 0
je .print
inc edx
jmp .find_length
.print:
mov eax, 4
mov ebx, 1
int 0x80
pop ecx
pop edx
pop ebx
pop eax
ret
; Ввод числа (возвращает в EAX)
input_number:
push ebx
push ecx
push edx
push esi
; Чтение строки
mov eax, 3
mov ebx, 0
mov ecx, buffer
mov edx, 32
int 0x80
; Преобразование строки в число
mov esi, buffer
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
; Проверка знака
mov bl, [esi]
cmp bl, '-'
jne .positive
inc edx ; флаг отрицательного
inc esi
jmp .next_char
.positive:
cmp bl, '+'
jne .next_char
inc esi
.next_char:
mov bl, [esi]
cmp bl, 0xA ; конец строки
je .done
cmp bl, 0xD ; конец строки
je .done
cmp bl, ' '
je .done
sub bl, '0'
imul eax, 10
add eax, ebx
inc esi
jmp .next_char
.done:
; Применяем знак
test edx, edx
jz .exit
neg eax
.exit:
pop esi
pop edx
pop ecx
pop ebx
ret
; Вывод числа из EAX
output_number:
push eax
push ebx
push ecx
push edx
push esi
push edi
mov edi, output_buf + 11
mov byte [edi], 0
dec edi
mov byte [edi], 0xA
mov ecx, 10
test eax, eax
jns .convert
; Отрицательное число
neg eax
push eax
mov eax, 4
mov ebx, 1
mov ecx, minus
mov edx, 1
int 0x80
pop eax
.convert:
xor edx, edx
div ecx
add dl, '0'
mov [edi], dl
dec edi
test eax, eax
jnz .convert
; Вывод результата
inc edi
mov ecx, edi
; Находим длину
mov esi, edi
xor edx, edx
.count:
cmp byte [esi], 0
je .print
inc esi
inc edx
jmp .count
.print:
mov eax, 4
mov ebx, 1
int 0x80
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret
_start:
; Первое число
mov ecx, prompt1
call print_string
call input_number
mov [num1], eax
; Второе число
mov ecx, prompt2
call print_string
call input_number
mov [num2], eax
; Сложение
mov eax, [num1]
add eax, [num2]
mov [sum], eax
; Вывод результата
mov ecx, result
call print_string
mov eax, [sum]
call output_number
; Новая строка
mov ecx, newline
call print_string
; Выход
mov eax, 1
xor ebx, ebx
int 0x80
c2VjdGlvbiAuZGF0YQogICAgcHJvbXB0MSAgIGRiICLQktCy0LXQtNC40YLQtSDQv9C10YDQstC+0LUg0YfQuNGB0LvQvjogIiwgMAogICAgcHJvbXB0MiAgIGRiICLQktCy0LXQtNC40YLQtSDQstGC0L7RgNC+0LUg0YfQuNGB0LvQvjogIiwgMAogICAgcmVzdWx0ICAgIGRiICLQoNC10LfRg9C70YzRgtCw0YI6ICIsIDAKICAgIG5ld2xpbmUgICBkYiAweEEsIDAKICAgIGJ1ZmZlciAgICB0aW1lcyAzMiBkYiAwCiAgICBtaW51cyAgICAgZGIgJy0nLCAwCgpzZWN0aW9uIC5ic3MKICAgIG51bTEgICAgICByZXNkIDEKICAgIG51bTIgICAgICByZXNkIDEKICAgIHN1bSAgICAgICByZXNkIDEKICAgIG91dHB1dF9idWYgcmVzYiAxMgoKc2VjdGlvbiAudGV4dAogICAgZ2xvYmFsIF9zdGFydAoKOyDQktGL0LLQvtC0INGB0YLRgNC+0LrQuAo7IEVDWCA9INCw0LTRgNC10YEg0YHRgtGA0L7QutC4CnByaW50X3N0cmluZzoKICAgIHB1c2ggZWF4CiAgICBwdXNoIGVieAogICAgcHVzaCBlZHgKICAgIHB1c2ggZWN4CiAgICAKICAgIDsg0J3QsNGF0L7QtNC40Lwg0LTQu9C40L3RgyDRgdGC0YDQvtC60LgKICAgIG1vdiBlZHgsIDAKLmZpbmRfbGVuZ3RoOgogICAgY21wIGJ5dGUgW2VjeCArIGVkeF0sIDAKICAgIGplIC5wcmludAogICAgaW5jIGVkeAogICAgam1wIC5maW5kX2xlbmd0aAogICAgCi5wcmludDoKICAgIG1vdiBlYXgsIDQKICAgIG1vdiBlYngsIDEKICAgIGludCAweDgwCiAgICAKICAgIHBvcCBlY3gKICAgIHBvcCBlZHgKICAgIHBvcCBlYngKICAgIHBvcCBlYXgKICAgIHJldAoKOyDQktCy0L7QtCDRh9C40YHQu9CwICjQstC+0LfQstGA0LDRidCw0LXRgiDQsiBFQVgpCmlucHV0X251bWJlcjoKICAgIHB1c2ggZWJ4CiAgICBwdXNoIGVjeAogICAgcHVzaCBlZHgKICAgIHB1c2ggZXNpCiAgICAKICAgIDsg0KfRgtC10L3QuNC1INGB0YLRgNC+0LrQuAogICAgbW92IGVheCwgMwogICAgbW92IGVieCwgMAogICAgbW92IGVjeCwgYnVmZmVyCiAgICBtb3YgZWR4LCAzMgogICAgaW50IDB4ODAKICAgIAogICAgOyDQn9GA0LXQvtCx0YDQsNC30L7QstCw0L3QuNC1INGB0YLRgNC+0LrQuCDQsiDRh9C40YHQu9C+CiAgICBtb3YgZXNpLCBidWZmZXIKICAgIHhvciBlYXgsIGVheAogICAgeG9yIGVieCwgZWJ4CiAgICB4b3IgZWN4LCBlY3gKICAgIHhvciBlZHgsIGVkeAogICAgCiAgICA7INCf0YDQvtCy0LXRgNC60LAg0LfQvdCw0LrQsAogICAgbW92IGJsLCBbZXNpXQogICAgY21wIGJsLCAnLScKICAgIGpuZSAucG9zaXRpdmUKICAgIGluYyBlZHggICAgICAgIDsg0YTQu9Cw0LMg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdC+0LPQvgogICAgaW5jIGVzaQogICAgam1wIC5uZXh0X2NoYXIKICAgIAoucG9zaXRpdmU6CiAgICBjbXAgYmwsICcrJwogICAgam5lIC5uZXh0X2NoYXIKICAgIGluYyBlc2kKICAgIAoubmV4dF9jaGFyOgogICAgbW92IGJsLCBbZXNpXQogICAgY21wIGJsLCAweEEgICAgOyDQutC+0L3QtdGGINGB0YLRgNC+0LrQuAogICAgamUgLmRvbmUKICAgIGNtcCBibCwgMHhEICAgIDsg0LrQvtC90LXRhiDRgdGC0YDQvtC60LgKICAgIGplIC5kb25lCiAgICBjbXAgYmwsICcgJwogICAgamUgLmRvbmUKICAgIAogICAgc3ViIGJsLCAnMCcKICAgIGltdWwgZWF4LCAxMAogICAgYWRkIGVheCwgZWJ4CiAgICBpbmMgZXNpCiAgICBqbXAgLm5leHRfY2hhcgogICAgCi5kb25lOgogICAgOyDQn9GA0LjQvNC10L3Rj9C10Lwg0LfQvdCw0LoKICAgIHRlc3QgZWR4LCBlZHgKICAgIGp6IC5leGl0CiAgICBuZWcgZWF4CiAgICAKLmV4aXQ6CiAgICBwb3AgZXNpCiAgICBwb3AgZWR4CiAgICBwb3AgZWN4CiAgICBwb3AgZWJ4CiAgICByZXQKCjsg0JLRi9Cy0L7QtCDRh9C40YHQu9CwINC40LcgRUFYCm91dHB1dF9udW1iZXI6CiAgICBwdXNoIGVheAogICAgcHVzaCBlYngKICAgIHB1c2ggZWN4CiAgICBwdXNoIGVkeAogICAgcHVzaCBlc2kKICAgIHB1c2ggZWRpCiAgICAKICAgIG1vdiBlZGksIG91dHB1dF9idWYgKyAxMQogICAgbW92IGJ5dGUgW2VkaV0sIDAKICAgIGRlYyBlZGkKICAgIG1vdiBieXRlIFtlZGldLCAweEEKICAgIAogICAgbW92IGVjeCwgMTAKICAgIHRlc3QgZWF4LCBlYXgKICAgIGpucyAuY29udmVydAogICAgCiAgICA7INCe0YLRgNC40YbQsNGC0LXQu9GM0L3QvtC1INGH0LjRgdC70L4KICAgIG5lZyBlYXgKICAgIHB1c2ggZWF4CiAgICBtb3YgZWF4LCA0CiAgICBtb3YgZWJ4LCAxCiAgICBtb3YgZWN4LCBtaW51cwogICAgbW92IGVkeCwgMQogICAgaW50IDB4ODAKICAgIHBvcCBlYXgKICAgIAouY29udmVydDoKICAgIHhvciBlZHgsIGVkeAogICAgZGl2IGVjeAogICAgYWRkIGRsLCAnMCcKICAgIG1vdiBbZWRpXSwgZGwKICAgIGRlYyBlZGkKICAgIHRlc3QgZWF4LCBlYXgKICAgIGpueiAuY29udmVydAogICAgCiAgICA7INCS0YvQstC+0LQg0YDQtdC30YPQu9GM0YLQsNGC0LAKICAgIGluYyBlZGkKICAgIG1vdiBlY3gsIGVkaQogICAgCiAgICA7INCd0LDRhdC+0LTQuNC8INC00LvQuNC90YMKICAgIG1vdiBlc2ksIGVkaQogICAgeG9yIGVkeCwgZWR4Ci5jb3VudDoKICAgIGNtcCBieXRlIFtlc2ldLCAwCiAgICBqZSAucHJpbnQKICAgIGluYyBlc2kKICAgIGluYyBlZHgKICAgIGptcCAuY291bnQKICAgIAoucHJpbnQ6CiAgICBtb3YgZWF4LCA0CiAgICBtb3YgZWJ4LCAxCiAgICBpbnQgMHg4MAogICAgCiAgICBwb3AgZWRpCiAgICBwb3AgZXNpCiAgICBwb3AgZWR4CiAgICBwb3AgZWN4CiAgICBwb3AgZWJ4CiAgICBwb3AgZWF4CiAgICByZXQKCl9zdGFydDoKICAgIDsg0J/QtdGA0LLQvtC1INGH0LjRgdC70L4KICAgIG1vdiBlY3gsIHByb21wdDEKICAgIGNhbGwgcHJpbnRfc3RyaW5nCiAgICBjYWxsIGlucHV0X251bWJlcgogICAgbW92IFtudW0xXSwgZWF4CiAgICAKICAgIDsg0JLRgtC+0YDQvtC1INGH0LjRgdC70L4KICAgIG1vdiBlY3gsIHByb21wdDIKICAgIGNhbGwgcHJpbnRfc3RyaW5nCiAgICBjYWxsIGlucHV0X251bWJlcgogICAgbW92IFtudW0yXSwgZWF4CiAgICAKICAgIDsg0KHQu9C+0LbQtdC90LjQtQogICAgbW92IGVheCwgW251bTFdCiAgICBhZGQgZWF4LCBbbnVtMl0KICAgIG1vdiBbc3VtXSwgZWF4CiAgICAKICAgIDsg0JLRi9Cy0L7QtCDRgNC10LfRg9C70YzRgtCw0YLQsAogICAgbW92IGVjeCwgcmVzdWx0CiAgICBjYWxsIHByaW50X3N0cmluZwogICAgbW92IGVheCwgW3N1bV0KICAgIGNhbGwgb3V0cHV0X251bWJlcgogICAgCiAgICA7INCd0L7QstCw0Y8g0YHRgtGA0L7QutCwCiAgICBtb3YgZWN4LCBuZXdsaW5lCiAgICBjYWxsIHByaW50X3N0cmluZwogICAgCiAgICA7INCS0YvRhdC+0LQKICAgIG1vdiBlYXgsIDEKICAgIHhvciBlYngsIGVieAogICAgaW50IDB4ODA=