section .data
prompt1 db "Введите первое число: ", 0
prompt2 db "Введите второе число: ", 0
result db "Результат: ", 0
newline db 0xA, 0xD, 0
buffer times 32 db 0
N equ 4
section .bss
num1 resd 1
num2 resd 1
sum resd 1
section .text
global _start
; Процедура ввода числа (возвращает в EAX)
input_number:
push ebx
push ecx
push edx
push esi
push edi
; Вывод приглашения
mov eax, 4
mov ebx, 1
mov edx, 21
int 0x80
; Ввод строки
mov eax, 3
mov ebx, 0
mov ecx, buffer
mov edx, 32
int 0x80
; Преобразование строки в число
mov esi, buffer
xor eax, eax ; аккумулятор = 0
xor ebx, ebx ; для хранения текущей цифры
mov ecx, 10 ; множитель
xor edi, edi ; флаг знака
; Пропуск пробелов
.skip_spaces:
mov bl, [esi]
cmp bl, ' '
jne .check_sign
inc esi
jmp .skip_spaces
.check_sign:
cmp byte [esi], '-'
jne .check_plus
inc edi
inc esi
jmp .parse_loop
.check_plus:
cmp byte [esi], '+'
jne .parse_loop
inc esi
.parse_loop:
mov bl, [esi]
cmp bl, 0xA
je .finish
cmp bl, 0xD
je .finish
cmp bl, '0'
jb .error
cmp bl, '9'
ja .error
sub bl, '0'
; Умножение eax на 10 (без использования imul)
push ebx
mov ebx, eax
shl eax, 1 ; eax * 2
lea eax, [eax + ebx*8] ; eax = eax*2 + ebx*8 = (eax)*10
pop ebx
add eax, ebx ; добавить новую цифру
inc esi
jmp .parse_loop
.error:
; Если встретили не цифру, просто завершаем
jmp .finish
.finish:
test edi, edi
jz .done
neg eax
.done:
pop edi
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, buffer + 31
mov byte [edi], 0
dec edi
mov byte [edi], 0xA
dec edi
mov ecx, 10
test eax, eax
jns .positive
; Отрицательное число
neg eax
mov byte [edi], '-'
dec edi
.positive:
; Специальная обработка для 0
test eax, eax
jnz .convert_loop
mov byte [edi], '0'
dec edi
jmp .output
.convert_loop:
xor edx, edx
div ecx
add dl, '0'
mov [edi], dl
dec edi
test eax, eax
jnz .convert_loop
.output:
inc edi
mov ecx, edi
mov edx, buffer + 32
sub edx, edi
mov eax, 4
mov ebx, 1
int 0x80
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax
ret
_start:
; Ввод первого числа
call input_number
mov [num1], eax
; Ввод второго числа
call input_number
mov [num2], eax
; Сложение чисел
mov eax, [num1]
add eax, [num2]
mov [sum], eax
; Вывод результата
mov ecx, result
mov edx, 11
mov eax, 4
mov ebx, 1
int 0x80
mov eax, [sum]
call output_number
; Вывод новой строки
mov ecx, newline
mov edx, 2
mov eax, 4
mov ebx, 1
int 0x80
; Завершение программы
mov eax, 1
xor ebx, ebx
int 0x80
c2VjdGlvbiAuZGF0YQogICAgcHJvbXB0MSAgIGRiICLQktCy0LXQtNC40YLQtSDQv9C10YDQstC+0LUg0YfQuNGB0LvQvjogIiwgMAogICAgcHJvbXB0MiAgIGRiICLQktCy0LXQtNC40YLQtSDQstGC0L7RgNC+0LUg0YfQuNGB0LvQvjogIiwgMAogICAgcmVzdWx0ICAgIGRiICLQoNC10LfRg9C70YzRgtCw0YI6ICIsIDAKICAgIG5ld2xpbmUgICBkYiAweEEsIDB4RCwgMAogICAgYnVmZmVyICAgIHRpbWVzIDMyIGRiIDAKICAgIE4gICAgICAgICBlcXUgNAoKc2VjdGlvbiAuYnNzCiAgICBudW0xICAgICAgcmVzZCAxCiAgICBudW0yICAgICAgcmVzZCAxCiAgICBzdW0gICAgICAgcmVzZCAxCgpzZWN0aW9uIC50ZXh0CiAgICBnbG9iYWwgX3N0YXJ0Cgo7INCf0YDQvtGG0LXQtNGD0YDQsCDQstCy0L7QtNCwINGH0LjRgdC70LAgKNCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINCyIEVBWCkKaW5wdXRfbnVtYmVyOgogICAgcHVzaCBlYngKICAgIHB1c2ggZWN4CiAgICBwdXNoIGVkeAogICAgcHVzaCBlc2kKICAgIHB1c2ggZWRpCiAgICAKICAgIDsg0JLRi9Cy0L7QtCDQv9GA0LjQs9C70LDRiNC10L3QuNGPCiAgICBtb3YgZWF4LCA0CiAgICBtb3YgZWJ4LCAxCiAgICBtb3YgZWR4LCAyMQogICAgaW50IDB4ODAKICAgIAogICAgOyDQktCy0L7QtCDRgdGC0YDQvtC60LgKICAgIG1vdiBlYXgsIDMKICAgIG1vdiBlYngsIDAKICAgIG1vdiBlY3gsIGJ1ZmZlcgogICAgbW92IGVkeCwgMzIKICAgIGludCAweDgwCiAgICAKICAgIDsg0J/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjQtSDRgdGC0YDQvtC60Lgg0LIg0YfQuNGB0LvQvgogICAgbW92IGVzaSwgYnVmZmVyCiAgICB4b3IgZWF4LCBlYXggICAgICAgICAgOyDQsNC60LrRg9C80YPQu9GP0YLQvtGAID0gMAogICAgeG9yIGVieCwgZWJ4ICAgICAgICAgIDsg0LTQu9GPINGF0YDQsNC90LXQvdC40Y8g0YLQtdC60YPRidC10Lkg0YbQuNGE0YDRiwogICAgbW92IGVjeCwgMTAgICAgICAgICAgIDsg0LzQvdC+0LbQuNGC0LXQu9GMCiAgICB4b3IgZWRpLCBlZGkgICAgICAgICAgOyDRhNC70LDQsyDQt9C90LDQutCwCiAgICAKICAgIDsg0J/RgNC+0L/Rg9GB0Log0L/RgNC+0LHQtdC70L7Qsgouc2tpcF9zcGFjZXM6CiAgICBtb3YgYmwsIFtlc2ldCiAgICBjbXAgYmwsICcgJwogICAgam5lIC5jaGVja19zaWduCiAgICBpbmMgZXNpCiAgICBqbXAgLnNraXBfc3BhY2VzCiAgICAKLmNoZWNrX3NpZ246CiAgICBjbXAgYnl0ZSBbZXNpXSwgJy0nCiAgICBqbmUgLmNoZWNrX3BsdXMKICAgIGluYyBlZGkKICAgIGluYyBlc2kKICAgIGptcCAucGFyc2VfbG9vcAogICAgCi5jaGVja19wbHVzOgogICAgY21wIGJ5dGUgW2VzaV0sICcrJwogICAgam5lIC5wYXJzZV9sb29wCiAgICBpbmMgZXNpCiAgICAKLnBhcnNlX2xvb3A6CiAgICBtb3YgYmwsIFtlc2ldCiAgICBjbXAgYmwsIDB4QQogICAgamUgLmZpbmlzaAogICAgY21wIGJsLCAweEQKICAgIGplIC5maW5pc2gKICAgIGNtcCBibCwgJzAnCiAgICBqYiAuZXJyb3IKICAgIGNtcCBibCwgJzknCiAgICBqYSAuZXJyb3IKICAgIAogICAgc3ViIGJsLCAnMCcKICAgIAogICAgOyDQo9C80L3QvtC20LXQvdC40LUgZWF4INC90LAgMTAgKNCx0LXQtyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjRjyBpbXVsKQogICAgcHVzaCBlYngKICAgIG1vdiBlYngsIGVheAogICAgc2hsIGVheCwgMSAgICAgICA7IGVheCAqIDIKICAgIGxlYSBlYXgsIFtlYXggKyBlYngqOF0gIDsgZWF4ID0gZWF4KjIgKyBlYngqOCA9IChlYXgpKjEwCiAgICBwb3AgZWJ4CiAgICAKICAgIGFkZCBlYXgsIGVieCAgICAgOyDQtNC+0LHQsNCy0LjRgtGMINC90L7QstGD0Y4g0YbQuNGE0YDRgwogICAgaW5jIGVzaQogICAgam1wIC5wYXJzZV9sb29wCiAgICAKLmVycm9yOgogICAgOyDQldGB0LvQuCDQstGB0YLRgNC10YLQuNC70Lgg0L3QtSDRhtC40YTRgNGDLCDQv9GA0L7RgdGC0L4g0LfQsNCy0LXRgNGI0LDQtdC8CiAgICBqbXAgLmZpbmlzaAogICAgCi5maW5pc2g6CiAgICB0ZXN0IGVkaSwgZWRpCiAgICBqeiAuZG9uZQogICAgbmVnIGVheAogICAgCi5kb25lOgogICAgcG9wIGVkaQogICAgcG9wIGVzaQogICAgcG9wIGVkeAogICAgcG9wIGVjeAogICAgcG9wIGVieAogICAgcmV0Cgo7INCf0YDQvtGG0LXQtNGD0YDQsCDQstGL0LLQvtC00LAg0YfQuNGB0LvQsCDQuNC3IEVBWApvdXRwdXRfbnVtYmVyOgogICAgcHVzaCBlYXgKICAgIHB1c2ggZWJ4CiAgICBwdXNoIGVjeAogICAgcHVzaCBlZHgKICAgIHB1c2ggZXNpCiAgICBwdXNoIGVkaQogICAgCiAgICBtb3YgZWRpLCBidWZmZXIgKyAzMQogICAgbW92IGJ5dGUgW2VkaV0sIDAKICAgIGRlYyBlZGkKICAgIG1vdiBieXRlIFtlZGldLCAweEEKICAgIGRlYyBlZGkKICAgIAogICAgbW92IGVjeCwgMTAKICAgIHRlc3QgZWF4LCBlYXgKICAgIGpucyAucG9zaXRpdmUKICAgIAogICAgOyDQntGC0YDQuNGG0LDRgtC10LvRjNC90L7QtSDRh9C40YHQu9C+CiAgICBuZWcgZWF4CiAgICBtb3YgYnl0ZSBbZWRpXSwgJy0nCiAgICBkZWMgZWRpCiAgICAKLnBvc2l0aXZlOgogICAgOyDQodC/0LXRhtC40LDQu9GM0L3QsNGPINC+0LHRgNCw0LHQvtGC0LrQsCDQtNC70Y8gMAogICAgdGVzdCBlYXgsIGVheAogICAgam56IC5jb252ZXJ0X2xvb3AKICAgIG1vdiBieXRlIFtlZGldLCAnMCcKICAgIGRlYyBlZGkKICAgIGptcCAub3V0cHV0CiAgICAKLmNvbnZlcnRfbG9vcDoKICAgIHhvciBlZHgsIGVkeAogICAgZGl2IGVjeAogICAgYWRkIGRsLCAnMCcKICAgIG1vdiBbZWRpXSwgZGwKICAgIGRlYyBlZGkKICAgIHRlc3QgZWF4LCBlYXgKICAgIGpueiAuY29udmVydF9sb29wCiAgICAKLm91dHB1dDoKICAgIGluYyBlZGkKICAgIG1vdiBlY3gsIGVkaQogICAgbW92IGVkeCwgYnVmZmVyICsgMzIKICAgIHN1YiBlZHgsIGVkaQogICAgCiAgICBtb3YgZWF4LCA0CiAgICBtb3YgZWJ4LCAxCiAgICBpbnQgMHg4MAogICAgCiAgICBwb3AgZWRpCiAgICBwb3AgZXNpCiAgICBwb3AgZWR4CiAgICBwb3AgZWN4CiAgICBwb3AgZWJ4CiAgICBwb3AgZWF4CiAgICByZXQKCl9zdGFydDoKICAgIDsg0JLQstC+0LQg0L/QtdGA0LLQvtCz0L4g0YfQuNGB0LvQsAogICAgY2FsbCBpbnB1dF9udW1iZXIKICAgIG1vdiBbbnVtMV0sIGVheAogICAgCiAgICA7INCS0LLQvtC0INCy0YLQvtGA0L7Qs9C+INGH0LjRgdC70LAKICAgIGNhbGwgaW5wdXRfbnVtYmVyCiAgICBtb3YgW251bTJdLCBlYXgKICAgIAogICAgOyDQodC70L7QttC10L3QuNC1INGH0LjRgdC10LsKICAgIG1vdiBlYXgsIFtudW0xXQogICAgYWRkIGVheCwgW251bTJdCiAgICBtb3YgW3N1bV0sIGVheAogICAgCiAgICA7INCS0YvQstC+0LQg0YDQtdC30YPQu9GM0YLQsNGC0LAKICAgIG1vdiBlY3gsIHJlc3VsdAogICAgbW92IGVkeCwgMTEKICAgIG1vdiBlYXgsIDQKICAgIG1vdiBlYngsIDEKICAgIGludCAweDgwCiAgICAKICAgIG1vdiBlYXgsIFtzdW1dCiAgICBjYWxsIG91dHB1dF9udW1iZXIKICAgIAogICAgOyDQktGL0LLQvtC0INC90L7QstC+0Lkg0YHRgtGA0L7QutC4CiAgICBtb3YgZWN4LCBuZXdsaW5lCiAgICBtb3YgZWR4LCAyCiAgICBtb3YgZWF4LCA0CiAgICBtb3YgZWJ4LCAxCiAgICBpbnQgMHg4MAogICAgCiAgICA7INCX0LDQstC10YDRiNC10L3QuNC1INC/0YDQvtCz0YDQsNC80LzRiwogICAgbW92IGVheCwgMQogICAgeG9yIGVieCwgZWJ4CiAgICBpbnQgMHg4MA==