section .data
; Определяем числа как строки (десятичные)
num1 db '1225', 0 ; Первое число (можно изменить)
num2 db '1', 0 ; Второе число (можно изменить)
result times 20 db 0 ; Буфер для результата
N equ 5 ; Размер чисел в байтах (можно изменить)
; Сообщения
msg1 db 'First number: ', 0
msg2 db 'Second number: ', 0
msg3 db 'Sum: ', 0
newline db 13, 10, 0
section .bss
; Дополнительные переменные при необходимости
section .text
global _start
_start:
; Вывод первого числа
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, msg1
mov edx, 13 ; длина msg1
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, num1
mov edx, N
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, newline
mov edx, 2
int 0x80
; Вывод второго числа
mov eax, 4
mov ebx, 1
mov ecx, msg2
mov edx, 15 ; длина msg2
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, num2
mov edx, N
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, newline
mov edx, 2
int 0x80
; Сложение двух N-байтовых десятичных чисел
call add_decimal_numbers
; Вывод результата
mov eax, 4
mov ebx, 1
mov ecx, msg3
mov edx, 5 ; длина msg3
int 0x80
; Вычисляем длину результата
mov edi, result
call strlen
mov edx, eax ; длина результата в edx
mov eax, 4
mov ebx, 1
mov ecx, result
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, newline
mov edx, 2
int 0x80
; Завершение программы
mov eax, 1 ; sys_exit
xor ebx, ebx ; код возврата 0
int 0x80
; Процедура сложения двух десятичных чисел
; Вход: num1, num2 - строки с десятичными числами
; Выход: result - строка с результатом
add_decimal_numbers:
pusha
; Инициализация
mov ecx, N ; Длина чисел
mov esi, num1
mov edi, num2
mov ebx, result
; Подготовка указателей на последние символы
add esi, ecx
dec esi ; ESI указывает на последний символ num1
add edi, ecx
dec edi ; EDI указывает на последний символ num2
add ebx, ecx
dec ebx ; EBX указывает на последнюю позицию в result
; Завершающий нуль для результата
mov byte [ebx+1], 0
; Сброс флага переноса
clc
mov dh, 0 ; Флаг переноса для следующего разряда
addition_loop:
; Преобразуем символы в числа
mov al, [esi]
sub al, '0'
mov ah, [edi]
sub ah, '0'
; Сложение с учетом переноса
adc al, ah
; Проверяем, нужно ли установить перенос для следующего разряда
mov dh, 0 ; Сбрасываем флаг переноса
cmp al, 10
jb no_carry
sub al, 10
mov dh, 1 ; Устанавливаем флаг переноса
no_carry:
; Преобразуем число обратно в символ
add al, '0'
mov [ebx], al
; Двигаем указатели
dec esi
dec edi
dec ebx
; Подготавливаем перенос для следующей итерации
cmp dh, 1
jne no_carry_set
stc ; Устанавливаем флаг переноса
jmp continue_loop
no_carry_set:
clc ; Сбрасываем флаг переноса
continue_loop:
dec ecx
jnz addition_loop
; Проверяем остался ли перенос после последнего разряда
jnc addition_done
; Добавляем '1' в начало если есть перенос
mov byte [ebx], '1'
jmp format_result
addition_done:
mov byte [ebx], '0'
format_result:
; Находим начало результата
mov ecx, N
lea ebx, [result+ecx]
mov byte [ebx], 0 ; Завершающий нуль
; Пропускаем ведущие нули
mov esi, result
skip_leading_zeros:
cmp byte [esi], '0'
jne check_if_all_zeros
inc esi
jmp skip_leading_zeros
check_if_all_zeros:
; Если все символы были '0'
cmp byte [esi], 0
jne copy_formatted
dec esi ; Возвращаем одну '0'
copy_formatted:
; Копируем форматированный результат в начало буфера
mov edi, result
copy_loop:
mov al, [esi]
mov [edi], al
inc esi
inc edi
test al, al
jnz copy_loop
popa
ret
; Функция вычисления длины строки
; Вход: EDI - указатель на строку
; Выход: EAX - длина строки
strlen:
push ecx
push edi
xor ecx, ecx
not ecx
xor al, al
cld
repne scasb
not ecx
dec ecx
mov eax, ecx
pop edi
pop ecx
ret
c2VjdGlvbiAuZGF0YQogICAgOyDQntC/0YDQtdC00LXQu9GP0LXQvCDRh9C40YHQu9CwINC60LDQuiDRgdGC0YDQvtC60LggKNC00LXRgdGP0YLQuNGH0L3Ri9C1KQogICAgbnVtMSBkYiAnMTIyNScsIDAgICAgICA7INCf0LXRgNCy0L7QtSDRh9C40YHQu9C+ICjQvNC+0LbQvdC+INC40LfQvNC10L3QuNGC0YwpCiAgICBudW0yIGRiICcxJywgMCAgICAgIDsg0JLRgtC+0YDQvtC1INGH0LjRgdC70L4gKNC80L7QttC90L4g0LjQt9C80LXQvdC40YLRjCkKICAgIHJlc3VsdCB0aW1lcyAyMCBkYiAwICAgIDsg0JHRg9GE0LXRgCDQtNC70Y8g0YDQtdC30YPQu9GM0YLQsNGC0LAKICAgIE4gZXF1IDUgICAgICAgICAgICAgICAgIDsg0KDQsNC30LzQtdGAINGH0LjRgdC10Lsg0LIg0LHQsNC50YLQsNGFICjQvNC+0LbQvdC+INC40LfQvNC10L3QuNGC0YwpCiAgICAKICAgIDsg0KHQvtC+0LHRidC10L3QuNGPCiAgICBtc2cxIGRiICdGaXJzdCBudW1iZXI6ICcsIDAKICAgIG1zZzIgZGIgJ1NlY29uZCBudW1iZXI6ICcsIDAKICAgIG1zZzMgZGIgJ1N1bTogJywgMAogICAgbmV3bGluZSBkYiAxMywgMTAsIDAKCnNlY3Rpb24gLmJzcwogICAgOyDQlNC+0L/QvtC70L3QuNGC0LXQu9GM0L3Ri9C1INC/0LXRgNC10LzQtdC90L3Ri9C1INC/0YDQuCDQvdC10L7QsdGF0L7QtNC40LzQvtGB0YLQuAoKc2VjdGlvbiAudGV4dAogICAgZ2xvYmFsIF9zdGFydAoKX3N0YXJ0OgogICAgOyDQktGL0LLQvtC0INC/0LXRgNCy0L7Qs9C+INGH0LjRgdC70LAKICAgIG1vdiBlYXgsIDQgICAgICAgICAgOyBzeXNfd3JpdGUKICAgIG1vdiBlYngsIDEgICAgICAgICAgOyBzdGRvdXQKICAgIG1vdiBlY3gsIG1zZzEKICAgIG1vdiBlZHgsIDEzICAgICAgICAgOyDQtNC70LjQvdCwIG1zZzEKICAgIGludCAweDgwCiAgICAKICAgIG1vdiBlYXgsIDQKICAgIG1vdiBlYngsIDEKICAgIG1vdiBlY3gsIG51bTEKICAgIG1vdiBlZHgsIE4KICAgIGludCAweDgwCiAgICAKICAgIG1vdiBlYXgsIDQKICAgIG1vdiBlYngsIDEKICAgIG1vdiBlY3gsIG5ld2xpbmUKICAgIG1vdiBlZHgsIDIKICAgIGludCAweDgwCiAgICAKICAgIDsg0JLRi9Cy0L7QtCDQstGC0L7RgNC+0LPQviDRh9C40YHQu9CwCiAgICBtb3YgZWF4LCA0CiAgICBtb3YgZWJ4LCAxCiAgICBtb3YgZWN4LCBtc2cyCiAgICBtb3YgZWR4LCAxNSAgICAgICAgIDsg0LTQu9C40L3QsCBtc2cyCiAgICBpbnQgMHg4MAogICAgCiAgICBtb3YgZWF4LCA0CiAgICBtb3YgZWJ4LCAxCiAgICBtb3YgZWN4LCBudW0yCiAgICBtb3YgZWR4LCBOCiAgICBpbnQgMHg4MAogICAgCiAgICBtb3YgZWF4LCA0CiAgICBtb3YgZWJ4LCAxCiAgICBtb3YgZWN4LCBuZXdsaW5lCiAgICBtb3YgZWR4LCAyCiAgICBpbnQgMHg4MAogICAgCiAgICA7INCh0LvQvtC20LXQvdC40LUg0LTQstGD0YUgTi3QsdCw0LnRgtC+0LLRi9GFINC00LXRgdGP0YLQuNGH0L3Ri9GFINGH0LjRgdC10LsKICAgIGNhbGwgYWRkX2RlY2ltYWxfbnVtYmVycwogICAgCiAgICA7INCS0YvQstC+0LQg0YDQtdC30YPQu9GM0YLQsNGC0LAKICAgIG1vdiBlYXgsIDQKICAgIG1vdiBlYngsIDEKICAgIG1vdiBlY3gsIG1zZzMKICAgIG1vdiBlZHgsIDUgICAgICAgICAgOyDQtNC70LjQvdCwIG1zZzMKICAgIGludCAweDgwCiAgICAKICAgIDsg0JLRi9GH0LjRgdC70Y/QtdC8INC00LvQuNC90YMg0YDQtdC30YPQu9GM0YLQsNGC0LAKICAgIG1vdiBlZGksIHJlc3VsdAogICAgY2FsbCBzdHJsZW4KICAgIG1vdiBlZHgsIGVheCAgICAgICAgOyDQtNC70LjQvdCwINGA0LXQt9GD0LvRjNGC0LDRgtCwINCyIGVkeAogICAgCiAgICBtb3YgZWF4LCA0CiAgICBtb3YgZWJ4LCAxCiAgICBtb3YgZWN4LCByZXN1bHQKICAgIGludCAweDgwCiAgICAKICAgIG1vdiBlYXgsIDQKICAgIG1vdiBlYngsIDEKICAgIG1vdiBlY3gsIG5ld2xpbmUKICAgIG1vdiBlZHgsIDIKICAgIGludCAweDgwCiAgICAKICAgIDsg0JfQsNCy0LXRgNGI0LXQvdC40LUg0L/RgNC+0LPRgNCw0LzQvNGLCiAgICBtb3YgZWF4LCAxICAgICAgICAgIDsgc3lzX2V4aXQKICAgIHhvciBlYngsIGVieCAgICAgICAgOyDQutC+0LQg0LLQvtC30LLRgNCw0YLQsCAwCiAgICBpbnQgMHg4MAoKOyDQn9GA0L7RhtC10LTRg9GA0LAg0YHQu9C+0LbQtdC90LjRjyDQtNCy0YPRhSDQtNC10YHRj9GC0LjRh9C90YvRhSDRh9C40YHQtdC7Cjsg0JLRhdC+0LQ6IG51bTEsIG51bTIgLSDRgdGC0YDQvtC60Lgg0YEg0LTQtdGB0Y/RgtC40YfQvdGL0LzQuCDRh9C40YHQu9Cw0LzQuAo7INCS0YvRhdC+0LQ6IHJlc3VsdCAtINGB0YLRgNC+0LrQsCDRgSDRgNC10LfRg9C70YzRgtCw0YLQvtC8CmFkZF9kZWNpbWFsX251bWJlcnM6CiAgICBwdXNoYQogICAgCiAgICA7INCY0L3QuNGG0LjQsNC70LjQt9Cw0YbQuNGPCiAgICBtb3YgZWN4LCBOICAgICAgICAgIDsg0JTQu9C40L3QsCDRh9C40YHQtdC7CiAgICBtb3YgZXNpLCBudW0xCiAgICBtb3YgZWRpLCBudW0yCiAgICBtb3YgZWJ4LCByZXN1bHQKICAgIAogICAgOyDQn9C+0LTQs9C+0YLQvtCy0LrQsCDRg9C60LDQt9Cw0YLQtdC70LXQuSDQvdCwINC/0L7RgdC70LXQtNC90LjQtSDRgdC40LzQstC+0LvRiwogICAgYWRkIGVzaSwgZWN4CiAgICBkZWMgZXNpICAgICAgICAgICAgIDsgRVNJINGD0LrQsNC30YvQstCw0LXRgiDQvdCwINC/0L7RgdC70LXQtNC90LjQuSDRgdC40LzQstC+0LsgbnVtMQogICAgYWRkIGVkaSwgZWN4CiAgICBkZWMgZWRpICAgICAgICAgICAgIDsgRURJINGD0LrQsNC30YvQstCw0LXRgiDQvdCwINC/0L7RgdC70LXQtNC90LjQuSDRgdC40LzQstC+0LsgbnVtMgogICAgYWRkIGVieCwgZWN4CiAgICBkZWMgZWJ4ICAgICAgICAgICAgIDsgRUJYINGD0LrQsNC30YvQstCw0LXRgiDQvdCwINC/0L7RgdC70LXQtNC90Y7RjiDQv9C+0LfQuNGG0LjRjiDQsiByZXN1bHQKICAgIAogICAgOyDQl9Cw0LLQtdGA0YjQsNGO0YnQuNC5INC90YPQu9GMINC00LvRjyDRgNC10LfRg9C70YzRgtCw0YLQsAogICAgbW92IGJ5dGUgW2VieCsxXSwgMAogICAgCiAgICA7INCh0LHRgNC+0YEg0YTQu9Cw0LPQsCDQv9C10YDQtdC90L7RgdCwCiAgICBjbGMKICAgIG1vdiBkaCwgMCAgICAgICAgICAgOyDQpNC70LDQsyDQv9C10YDQtdC90L7RgdCwINC00LvRjyDRgdC70LXQtNGD0Y7RidC10LPQviDRgNCw0LfRgNGP0LTQsAoKYWRkaXRpb25fbG9vcDoKICAgIDsg0J/RgNC10L7QsdGA0LDQt9GD0LXQvCDRgdC40LzQstC+0LvRiyDQsiDRh9C40YHQu9CwCiAgICBtb3YgYWwsIFtlc2ldCiAgICBzdWIgYWwsICcwJwogICAgCiAgICBtb3YgYWgsIFtlZGldCiAgICBzdWIgYWgsICcwJwogICAgCiAgICA7INCh0LvQvtC20LXQvdC40LUg0YEg0YPRh9C10YLQvtC8INC/0LXRgNC10L3QvtGB0LAKICAgIGFkYyBhbCwgYWgKICAgIAogICAgOyDQn9GA0L7QstC10YDRj9C10LwsINC90YPQttC90L4g0LvQuCDRg9GB0YLQsNC90L7QstC40YLRjCDQv9C10YDQtdC90L7RgSDQtNC70Y8g0YHQu9C10LTRg9GO0YnQtdCz0L4g0YDQsNC30YDRj9C00LAKICAgIG1vdiBkaCwgMCAgICAgICAgICA7INCh0LHRgNCw0YHRi9Cy0LDQtdC8INGE0LvQsNCzINC/0LXRgNC10L3QvtGB0LAKICAgIGNtcCBhbCwgMTAKICAgIGpiIG5vX2NhcnJ5CiAgICBzdWIgYWwsIDEwCiAgICBtb3YgZGgsIDEgICAgICAgICAgOyDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCDRhNC70LDQsyDQv9C10YDQtdC90L7RgdCwCgpub19jYXJyeToKICAgIDsg0J/RgNC10L7QsdGA0LDQt9GD0LXQvCDRh9C40YHQu9C+INC+0LHRgNCw0YLQvdC+INCyINGB0LjQvNCy0L7QuwogICAgYWRkIGFsLCAnMCcKICAgIG1vdiBbZWJ4XSwgYWwKICAgIAogICAgOyDQlNCy0LjQs9Cw0LXQvCDRg9C60LDQt9Cw0YLQtdC70LgKICAgIGRlYyBlc2kKICAgIGRlYyBlZGkKICAgIGRlYyBlYngKICAgIAogICAgOyDQn9C+0LTQs9C+0YLQsNCy0LvQuNCy0LDQtdC8INC/0LXRgNC10L3QvtGBINC00LvRjyDRgdC70LXQtNGD0Y7RidC10Lkg0LjRgtC10YDQsNGG0LjQuAogICAgY21wIGRoLCAxCiAgICBqbmUgbm9fY2Fycnlfc2V0CiAgICBzdGMgICAgICAgICAgICAgICAgOyDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCDRhNC70LDQsyDQv9C10YDQtdC90L7RgdCwCiAgICBqbXAgY29udGludWVfbG9vcApub19jYXJyeV9zZXQ6CiAgICBjbGMgICAgICAgICAgICAgICAgOyDQodCx0YDQsNGB0YvQstCw0LXQvCDRhNC70LDQsyDQv9C10YDQtdC90L7RgdCwCiAgICAKY29udGludWVfbG9vcDoKICAgIGRlYyBlY3gKICAgIGpueiBhZGRpdGlvbl9sb29wCiAgICAKICAgIDsg0J/RgNC+0LLQtdGA0Y/QtdC8INC+0YHRgtCw0LvRgdGPINC70Lgg0L/QtdGA0LXQvdC+0YEg0L/QvtGB0LvQtSDQv9C+0YHQu9C10LTQvdC10LPQviDRgNCw0LfRgNGP0LTQsAogICAgam5jIGFkZGl0aW9uX2RvbmUKICAgIAogICAgOyDQlNC+0LHQsNCy0LvRj9C10LwgJzEnINCyINC90LDRh9Cw0LvQviDQtdGB0LvQuCDQtdGB0YLRjCDQv9C10YDQtdC90L7RgQogICAgbW92IGJ5dGUgW2VieF0sICcxJwogICAgam1wIGZvcm1hdF9yZXN1bHQKCmFkZGl0aW9uX2RvbmU6CiAgICBtb3YgYnl0ZSBbZWJ4XSwgJzAnCgpmb3JtYXRfcmVzdWx0OgogICAgOyDQndCw0YXQvtC00LjQvCDQvdCw0YfQsNC70L4g0YDQtdC30YPQu9GM0YLQsNGC0LAKICAgIG1vdiBlY3gsIE4KICAgIGxlYSBlYngsIFtyZXN1bHQrZWN4XQogICAgbW92IGJ5dGUgW2VieF0sIDAgICA7INCX0LDQstC10YDRiNCw0Y7RidC40Lkg0L3Rg9C70YwKICAgIAogICAgOyDQn9GA0L7Qv9GD0YHQutCw0LXQvCDQstC10LTRg9GJ0LjQtSDQvdGD0LvQuAogICAgbW92IGVzaSwgcmVzdWx0CnNraXBfbGVhZGluZ196ZXJvczoKICAgIGNtcCBieXRlIFtlc2ldLCAnMCcKICAgIGpuZSBjaGVja19pZl9hbGxfemVyb3MKICAgIGluYyBlc2kKICAgIGptcCBza2lwX2xlYWRpbmdfemVyb3MKCmNoZWNrX2lmX2FsbF96ZXJvczoKICAgIDsg0JXRgdC70Lgg0LLRgdC1INGB0LjQvNCy0L7Qu9GLINCx0YvQu9C4ICcwJwogICAgY21wIGJ5dGUgW2VzaV0sIDAKICAgIGpuZSBjb3B5X2Zvcm1hdHRlZAogICAgZGVjIGVzaSAgICAgICAgICAgICAgOyDQktC+0LfQstGA0LDRidCw0LXQvCDQvtC00L3RgyAnMCcKCmNvcHlfZm9ybWF0dGVkOgogICAgOyDQmtC+0L/QuNGA0YPQtdC8INGE0L7RgNC80LDRgtC40YDQvtCy0LDQvdC90YvQuSDRgNC10LfRg9C70YzRgtCw0YIg0LIg0L3QsNGH0LDQu9C+INCx0YPRhNC10YDQsAogICAgbW92IGVkaSwgcmVzdWx0CmNvcHlfbG9vcDoKICAgIG1vdiBhbCwgW2VzaV0KICAgIG1vdiBbZWRpXSwgYWwKICAgIGluYyBlc2kKICAgIGluYyBlZGkKICAgIHRlc3QgYWwsIGFsCiAgICBqbnogY29weV9sb29wCiAgICAKICAgIHBvcGEKICAgIHJldAoKOyDQpNGD0L3QutGG0LjRjyDQstGL0YfQuNGB0LvQtdC90LjRjyDQtNC70LjQvdGLINGB0YLRgNC+0LrQuAo7INCS0YXQvtC0OiBFREkgLSDRg9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDRgdGC0YDQvtC60YMKOyDQktGL0YXQvtC0OiBFQVggLSDQtNC70LjQvdCwINGB0YLRgNC+0LrQuApzdHJsZW46CiAgICBwdXNoIGVjeAogICAgcHVzaCBlZGkKICAgIHhvciBlY3gsIGVjeAogICAgbm90IGVjeAogICAgeG9yIGFsLCBhbAogICAgY2xkCiAgICByZXBuZSBzY2FzYgogICAgbm90IGVjeAogICAgZGVjIGVjeAogICAgbW92IGVheCwgZWN4CiAgICBwb3AgZWRpCiAgICBwb3AgZWN4CiAgICByZXQ=