section .data
; Определяем числа как строки (десятичные)
num1 db '11111', 0 ; Первое число (можно изменить)
num2 db '22222', 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/0YDQtdC00LXQu9GP0LXQvCDRh9C40YHQu9CwINC60LDQuiDRgdGC0YDQvtC60LggKNC00LXRgdGP0YLQuNGH0L3Ri9C1KQogICAgbnVtMSBkYiAnMTExMTEnLCAwICAgICAgOyDQn9C10YDQstC+0LUg0YfQuNGB0LvQviAo0LzQvtC20L3QviDQuNC30LzQtdC90LjRgtGMKQogICAgbnVtMiBkYiAnMjIyMjInLCAwICAgICAgOyDQktGC0L7RgNC+0LUg0YfQuNGB0LvQviAo0LzQvtC20L3QviDQuNC30LzQtdC90LjRgtGMKQogICAgcmVzdWx0IHRpbWVzIDIwIGRiIDAgICAgOyDQkdGD0YTQtdGAINC00LvRjyDRgNC10LfRg9C70YzRgtCw0YLQsAogICAgTiBlcXUgNSAgICAgICAgICAgICAgICAgOyDQoNCw0LfQvNC10YAg0YfQuNGB0LXQuyDQsiDQsdCw0LnRgtCw0YUgKNC80L7QttC90L4g0LjQt9C80LXQvdC40YLRjCkKICAgIAogICAgOyDQodC+0L7QsdGJ0LXQvdC40Y8KICAgIG1zZzEgZGIgJ0ZpcnN0IG51bWJlcjogJywgMAogICAgbXNnMiBkYiAnU2Vjb25kIG51bWJlcjogJywgMAogICAgbXNnMyBkYiAnU3VtOiAnLCAwCiAgICBuZXdsaW5lIGRiIDEzLCAxMCwgMAoKc2VjdGlvbiAuYnNzCiAgICA7INCU0L7Qv9C+0LvQvdC40YLQtdC70YzQvdGL0LUg0L/QtdGA0LXQvNC10L3QvdGL0LUg0L/RgNC4INC90LXQvtCx0YXQvtC00LjQvNC+0YHRgtC4CgpzZWN0aW9uIC50ZXh0CiAgICBnbG9iYWwgX3N0YXJ0Cgpfc3RhcnQ6CiAgICA7INCS0YvQstC+0LQg0L/QtdGA0LLQvtCz0L4g0YfQuNGB0LvQsAogICAgbW92IGVheCwgNCAgICAgICAgICA7IHN5c193cml0ZQogICAgbW92IGVieCwgMSAgICAgICAgICA7IHN0ZG91dAogICAgbW92IGVjeCwgbXNnMQogICAgbW92IGVkeCwgMTMgICAgICAgICA7INC00LvQuNC90LAgbXNnMQogICAgaW50IDB4ODAKICAgIAogICAgbW92IGVheCwgNAogICAgbW92IGVieCwgMQogICAgbW92IGVjeCwgbnVtMQogICAgbW92IGVkeCwgTgogICAgaW50IDB4ODAKICAgIAogICAgbW92IGVheCwgNAogICAgbW92IGVieCwgMQogICAgbW92IGVjeCwgbmV3bGluZQogICAgbW92IGVkeCwgMgogICAgaW50IDB4ODAKICAgIAogICAgOyDQktGL0LLQvtC0INCy0YLQvtGA0L7Qs9C+INGH0LjRgdC70LAKICAgIG1vdiBlYXgsIDQKICAgIG1vdiBlYngsIDEKICAgIG1vdiBlY3gsIG1zZzIKICAgIG1vdiBlZHgsIDE1ICAgICAgICAgOyDQtNC70LjQvdCwIG1zZzIKICAgIGludCAweDgwCiAgICAKICAgIG1vdiBlYXgsIDQKICAgIG1vdiBlYngsIDEKICAgIG1vdiBlY3gsIG51bTIKICAgIG1vdiBlZHgsIE4KICAgIGludCAweDgwCiAgICAKICAgIG1vdiBlYXgsIDQKICAgIG1vdiBlYngsIDEKICAgIG1vdiBlY3gsIG5ld2xpbmUKICAgIG1vdiBlZHgsIDIKICAgIGludCAweDgwCiAgICAKICAgIDsg0KHQu9C+0LbQtdC90LjQtSDQtNCy0YPRhSBOLdCx0LDQudGC0L7QstGL0YUg0LTQtdGB0Y/RgtC40YfQvdGL0YUg0YfQuNGB0LXQuwogICAgY2FsbCBhZGRfZGVjaW1hbF9udW1iZXJzCiAgICAKICAgIDsg0JLRi9Cy0L7QtCDRgNC10LfRg9C70YzRgtCw0YLQsAogICAgbW92IGVheCwgNAogICAgbW92IGVieCwgMQogICAgbW92IGVjeCwgbXNnMwogICAgbW92IGVkeCwgNSAgICAgICAgICA7INC00LvQuNC90LAgbXNnMwogICAgaW50IDB4ODAKICAgIAogICAgOyDQktGL0YfQuNGB0LvRj9C10Lwg0LTQu9C40L3RgyDRgNC10LfRg9C70YzRgtCw0YLQsAogICAgbW92IGVkaSwgcmVzdWx0CiAgICBjYWxsIHN0cmxlbgogICAgbW92IGVkeCwgZWF4ICAgICAgICA7INC00LvQuNC90LAg0YDQtdC30YPQu9GM0YLQsNGC0LAg0LIgZWR4CiAgICAKICAgIG1vdiBlYXgsIDQKICAgIG1vdiBlYngsIDEKICAgIG1vdiBlY3gsIHJlc3VsdAogICAgaW50IDB4ODAKICAgIAogICAgbW92IGVheCwgNAogICAgbW92IGVieCwgMQogICAgbW92IGVjeCwgbmV3bGluZQogICAgbW92IGVkeCwgMgogICAgaW50IDB4ODAKICAgIAogICAgOyDQl9Cw0LLQtdGA0YjQtdC90LjQtSDQv9GA0L7Qs9GA0LDQvNC80YsKICAgIG1vdiBlYXgsIDEgICAgICAgICAgOyBzeXNfZXhpdAogICAgeG9yIGVieCwgZWJ4ICAgICAgICA7INC60L7QtCDQstC+0LfQstGA0LDRgtCwIDAKICAgIGludCAweDgwCgo7INCf0YDQvtGG0LXQtNGD0YDQsCDRgdC70L7QttC10L3QuNGPINC00LLRg9GFINC00LXRgdGP0YLQuNGH0L3Ri9GFINGH0LjRgdC10LsKOyDQktGF0L7QtDogbnVtMSwgbnVtMiAtINGB0YLRgNC+0LrQuCDRgSDQtNC10YHRj9GC0LjRh9C90YvQvNC4INGH0LjRgdC70LDQvNC4Cjsg0JLRi9GF0L7QtDogcmVzdWx0IC0g0YHRgtGA0L7QutCwINGBINGA0LXQt9GD0LvRjNGC0LDRgtC+0LwKYWRkX2RlY2ltYWxfbnVtYmVyczoKICAgIHB1c2hhCiAgICAKICAgIDsg0JjQvdC40YbQuNCw0LvQuNC30LDRhtC40Y8KICAgIG1vdiBlY3gsIE4gICAgICAgICAgOyDQlNC70LjQvdCwINGH0LjRgdC10LsKICAgIG1vdiBlc2ksIG51bTEKICAgIG1vdiBlZGksIG51bTIKICAgIG1vdiBlYngsIHJlc3VsdAogICAgCiAgICA7INCf0L7QtNCz0L7RgtC+0LLQutCwINGD0LrQsNC30LDRgtC10LvQtdC5INC90LAg0L/QvtGB0LvQtdC00L3QuNC1INGB0LjQvNCy0L7Qu9GLCiAgICBhZGQgZXNpLCBlY3gKICAgIGRlYyBlc2kgICAgICAgICAgICAgOyBFU0kg0YPQutCw0LfRi9Cy0LDQtdGCINC90LAg0L/QvtGB0LvQtdC00L3QuNC5INGB0LjQvNCy0L7QuyBudW0xCiAgICBhZGQgZWRpLCBlY3gKICAgIGRlYyBlZGkgICAgICAgICAgICAgOyBFREkg0YPQutCw0LfRi9Cy0LDQtdGCINC90LAg0L/QvtGB0LvQtdC00L3QuNC5INGB0LjQvNCy0L7QuyBudW0yCiAgICBhZGQgZWJ4LCBlY3gKICAgIGRlYyBlYnggICAgICAgICAgICAgOyBFQlgg0YPQutCw0LfRi9Cy0LDQtdGCINC90LAg0L/QvtGB0LvQtdC00L3RjtGOINC/0L7Qt9C40YbQuNGOINCyIHJlc3VsdAogICAgCiAgICA7INCX0LDQstC10YDRiNCw0Y7RidC40Lkg0L3Rg9C70Ywg0LTQu9GPINGA0LXQt9GD0LvRjNGC0LDRgtCwCiAgICBtb3YgYnl0ZSBbZWJ4KzFdLCAwCiAgICAKICAgIDsg0KHQsdGA0L7RgSDRhNC70LDQs9CwINC/0LXRgNC10L3QvtGB0LAKICAgIGNsYwogICAgbW92IGRoLCAwICAgICAgICAgICA7INCk0LvQsNCzINC/0LXRgNC10L3QvtGB0LAg0LTQu9GPINGB0LvQtdC00YPRjtGJ0LXQs9C+INGA0LDQt9GA0Y/QtNCwCgphZGRpdGlvbl9sb29wOgogICAgOyDQn9GA0LXQvtCx0YDQsNC30YPQtdC8INGB0LjQvNCy0L7Qu9GLINCyINGH0LjRgdC70LAKICAgIG1vdiBhbCwgW2VzaV0KICAgIHN1YiBhbCwgJzAnCiAgICAKICAgIG1vdiBhaCwgW2VkaV0KICAgIHN1YiBhaCwgJzAnCiAgICAKICAgIDsg0KHQu9C+0LbQtdC90LjQtSDRgSDRg9GH0LXRgtC+0Lwg0L/QtdGA0LXQvdC+0YHQsAogICAgYWRjIGFsLCBhaAogICAgCiAgICA7INCf0YDQvtCy0LXRgNGP0LXQvCwg0L3Rg9C20L3QviDQu9C4INGD0YHRgtCw0L3QvtCy0LjRgtGMINC/0LXRgNC10L3QvtGBINC00LvRjyDRgdC70LXQtNGD0Y7RidC10LPQviDRgNCw0LfRgNGP0LTQsAogICAgbW92IGRoLCAwICAgICAgICAgIDsg0KHQsdGA0LDRgdGL0LLQsNC10Lwg0YTQu9Cw0LMg0L/QtdGA0LXQvdC+0YHQsAogICAgY21wIGFsLCAxMAogICAgamIgbm9fY2FycnkKICAgIHN1YiBhbCwgMTAKICAgIG1vdiBkaCwgMSAgICAgICAgICA7INCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC8INGE0LvQsNCzINC/0LXRgNC10L3QvtGB0LAKCm5vX2NhcnJ5OgogICAgOyDQn9GA0LXQvtCx0YDQsNC30YPQtdC8INGH0LjRgdC70L4g0L7QsdGA0LDRgtC90L4g0LIg0YHQuNC80LLQvtC7CiAgICBhZGQgYWwsICcwJwogICAgbW92IFtlYnhdLCBhbAogICAgCiAgICA7INCU0LLQuNCz0LDQtdC8INGD0LrQsNC30LDRgtC10LvQuAogICAgZGVjIGVzaQogICAgZGVjIGVkaQogICAgZGVjIGVieAogICAgCiAgICA7INCf0L7QtNCz0L7RgtCw0LLQu9C40LLQsNC10Lwg0L/QtdGA0LXQvdC+0YEg0LTQu9GPINGB0LvQtdC00YPRjtGJ0LXQuSDQuNGC0LXRgNCw0YbQuNC4CiAgICBjbXAgZGgsIDEKICAgIGpuZSBub19jYXJyeV9zZXQKICAgIHN0YyAgICAgICAgICAgICAgICA7INCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC8INGE0LvQsNCzINC/0LXRgNC10L3QvtGB0LAKICAgIGptcCBjb250aW51ZV9sb29wCm5vX2NhcnJ5X3NldDoKICAgIGNsYyAgICAgICAgICAgICAgICA7INCh0LHRgNCw0YHRi9Cy0LDQtdC8INGE0LvQsNCzINC/0LXRgNC10L3QvtGB0LAKICAgIApjb250aW51ZV9sb29wOgogICAgZGVjIGVjeAogICAgam56IGFkZGl0aW9uX2xvb3AKICAgIAogICAgOyDQn9GA0L7QstC10YDRj9C10Lwg0L7RgdGC0LDQu9GB0Y8g0LvQuCDQv9C10YDQtdC90L7RgSDQv9C+0YHQu9C1INC/0L7RgdC70LXQtNC90LXQs9C+INGA0LDQt9GA0Y/QtNCwCiAgICBqbmMgYWRkaXRpb25fZG9uZQogICAgCiAgICA7INCU0L7QsdCw0LLQu9GP0LXQvCAnMScg0LIg0L3QsNGH0LDQu9C+INC10YHQu9C4INC10YHRgtGMINC/0LXRgNC10L3QvtGBCiAgICBtb3YgYnl0ZSBbZWJ4XSwgJzEnCiAgICBqbXAgZm9ybWF0X3Jlc3VsdAoKYWRkaXRpb25fZG9uZToKICAgIG1vdiBieXRlIFtlYnhdLCAnMCcKCmZvcm1hdF9yZXN1bHQ6CiAgICA7INCd0LDRhdC+0LTQuNC8INC90LDRh9Cw0LvQviDRgNC10LfRg9C70YzRgtCw0YLQsAogICAgbW92IGVjeCwgTgogICAgbGVhIGVieCwgW3Jlc3VsdCtlY3hdCiAgICBtb3YgYnl0ZSBbZWJ4XSwgMCAgIDsg0JfQsNCy0LXRgNGI0LDRjtGJ0LjQuSDQvdGD0LvRjAogICAgCiAgICA7INCf0YDQvtC/0YPRgdC60LDQtdC8INCy0LXQtNGD0YnQuNC1INC90YPQu9C4CiAgICBtb3YgZXNpLCByZXN1bHQKc2tpcF9sZWFkaW5nX3plcm9zOgogICAgY21wIGJ5dGUgW2VzaV0sICcwJwogICAgam5lIGNoZWNrX2lmX2FsbF96ZXJvcwogICAgaW5jIGVzaQogICAgam1wIHNraXBfbGVhZGluZ196ZXJvcwoKY2hlY2tfaWZfYWxsX3plcm9zOgogICAgOyDQldGB0LvQuCDQstGB0LUg0YHQuNC80LLQvtC70Ysg0LHRi9C70LggJzAnCiAgICBjbXAgYnl0ZSBbZXNpXSwgMAogICAgam5lIGNvcHlfZm9ybWF0dGVkCiAgICBkZWMgZXNpICAgICAgICAgICAgICA7INCS0L7Qt9Cy0YDQsNGJ0LDQtdC8INC+0LTQvdGDICcwJwoKY29weV9mb3JtYXR0ZWQ6CiAgICA7INCa0L7Qv9C40YDRg9C10Lwg0YTQvtGA0LzQsNGC0LjRgNC+0LLQsNC90L3Ri9C5INGA0LXQt9GD0LvRjNGC0LDRgiDQsiDQvdCw0YfQsNC70L4g0LHRg9GE0LXRgNCwCiAgICBtb3YgZWRpLCByZXN1bHQKY29weV9sb29wOgogICAgbW92IGFsLCBbZXNpXQogICAgbW92IFtlZGldLCBhbAogICAgaW5jIGVzaQogICAgaW5jIGVkaQogICAgdGVzdCBhbCwgYWwKICAgIGpueiBjb3B5X2xvb3AKICAgIAogICAgcG9wYQogICAgcmV0Cgo7INCk0YPQvdC60YbQuNGPINCy0YvRh9C40YHQu9C10L3QuNGPINC00LvQuNC90Ysg0YHRgtGA0L7QutC4Cjsg0JLRhdC+0LQ6IEVESSAtINGD0LrQsNC30LDRgtC10LvRjCDQvdCwINGB0YLRgNC+0LrRgwo7INCS0YvRhdC+0LQ6IEVBWCAtINC00LvQuNC90LAg0YHRgtGA0L7QutC4CnN0cmxlbjoKICAgIHB1c2ggZWN4CiAgICBwdXNoIGVkaQogICAgeG9yIGVjeCwgZWN4CiAgICBub3QgZWN4CiAgICB4b3IgYWwsIGFsCiAgICBjbGQKICAgIHJlcG5lIHNjYXNiCiAgICBub3QgZWN4CiAgICBkZWMgZWN4CiAgICBtb3YgZWF4LCBlY3gKICAgIHBvcCBlZGkKICAgIHBvcCBlY3gKICAgIHJldA==