section .data
; Текстовые сообщения
msg_prompt db 'Введите число (или 0 для выхода): ', 0
msg_result db 'Результат: ', 0
msg_continue db 'Продолжить? (1-да, 0-нет): ', 0
msg_exit db 'Выход из калькулятора', 10, 0
msg_error db 'Ошибка ввода!', 10, 0
newline db 10, 0
; Буфер для ввода
buffer times 16 db 0
section .bss
; Переменные
num1 resq 1 ; 64-битное число
num2 resq 1
result resq 1
choice resb 1
section .text
global _start
_start:
; Основной цикл калькулятора
main_loop:
; Выводим приглашение
mov rax, 1 ; sys_write (64-bit)
mov rdi, 1 ; stdout
mov rsi, msg_prompt
mov rdx, 31 ; длина строки
syscall
; Читаем первое число
call read_number
cmp rax, 0 ; Если ввели 0
je exit_program ; выходим
mov [num1], rax ; Сохраняем первое число
; Выводим приглашение для второго числа
mov rax, 1
mov rdi, 1
mov rsi, msg_prompt
mov rdx, 31
syscall
; Читаем второе число
call read_number
mov [num2], rax
; СЛОЖЕНИЕ
mov rax, [num1]
add rax, [num2] ; Складываем
mov [result], rax ; Сохраняем результат
; Выводим "Результат: "
mov rax, 1
mov rdi, 1
mov rsi, msg_result
mov rdx, 11
syscall
; Преобразуем число в строку и выводим
mov rax, [result]
call print_number
; Новая строка
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
; Спрашиваем, продолжить ли
mov rax, 1
mov rdi, 1
mov rsi, msg_continue
mov rdx, 31
syscall
; Читаем выбор
mov rax, 0 ; sys_read
mov rdi, 0 ; stdin
mov rsi, choice
mov rdx, 2
syscall
; Проверяем выбор
mov al, [choice]
cmp al, '1'
je main_loop ; Продолжаем если '1'
; Иначе выходим
jmp exit_program
; Функция чтения числа
read_number:
push rbx
push rcx
push rdx
; Читаем строку
mov rax, 0 ; sys_read
mov rdi, 0 ; stdin
mov rsi, buffer
mov rdx, 16
syscall
; Преобразуем строку в число
xor rax, rax ; Обнуляем rax (результат)
xor rbx, rbx ; Обнуляем rbx (текущий символ)
mov rcx, buffer ; Указатель на строку
convert_loop:
mov bl, [rcx] ; Берём символ
cmp bl, 10 ; Проверяем конец строки
je convert_done
cmp bl, 0 ; Или нуль-терминатор
je convert_done
; Проверяем что это цифра
cmp bl, '0'
jl input_error
cmp bl, '9'
jg input_error
; Преобразуем символ в цифру
sub bl, '0'
; Умножаем текущий результат на 10
imul rax, 10
add rax, rbx ; Добавляем новую цифру
inc rcx ; Следующий символ
jmp convert_loop
convert_done:
pop rdx
pop rcx
pop rbx
ret
input_error:
; Выводим сообщение об ошибке
mov rax, 1
mov rdi, 1
mov rsi, msg_error
mov rdx, 14
syscall
; Возвращаем 0
xor rax, rax
jmp convert_done
; Функция печати числа
print_number:
push rax
push rbx
push rcx
push rdx
; Преобразуем число в строку
mov rbx, buffer + 15 ; Конец буфера
mov byte [rbx], 0 ; Нуль-терминатор
dec rbx
mov byte [rbx], 10 ; Перенос строки
dec rbx
mov rcx, 10 ; Делитель
; Если число 0
cmp rax, 0
jne convert_loop2
mov byte [rbx], '0'
dec rbx
convert_loop2:
xor rdx, rdx ; Обнуляем rdx для деления
div rcx
; Делим rax на
10, остаток в rdx
; Преобразуем остаток в символ
add dl, '0'
mov [rbx], dl
dec rbx
; Проверяем, закончили ли
test rax, rax
jnz convert_loop2
; Выводим строку
inc rbx ; Корректируем указатель
mov rcx, rbx
mov rdx, buffer + 16
sub rdx, rcx ; Вычисляем длину
; Теперь нужно правильно передать параметры
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rsi, rbx ; строка
; rdx уже содержит длину
syscall
pop rdx
pop rcx
pop rbx
pop rax
ret
; Выход из программы
exit_program:
; Сообщение о выходе
mov rax, 1
mov rdi, 1
mov rsi, msg_exit
mov rdx, 20
syscall
; Завершаем программу
mov rax, 60 ; sys_exit (64-bit)
xor rdi, rdi ; код возврата 0
syscall
c2VjdGlvbiAuZGF0YQogICAgOyDQotC10LrRgdGC0L7QstGL0LUg0YHQvtC+0LHRidC10L3QuNGPCiAgICBtc2dfcHJvbXB0ICAgIGRiICfQktCy0LXQtNC40YLQtSDRh9C40YHQu9C+ICjQuNC70LggMCDQtNC70Y8g0LLRi9GF0L7QtNCwKTogJywgMAogICAgbXNnX3Jlc3VsdCAgICBkYiAn0KDQtdC30YPQu9GM0YLQsNGCOiAnLCAwCiAgICBtc2dfY29udGludWUgIGRiICfQn9GA0L7QtNC+0LvQttC40YLRjD8gKDEt0LTQsCwgMC3QvdC10YIpOiAnLCAwCiAgICBtc2dfZXhpdCAgICAgIGRiICfQktGL0YXQvtC0INC40Lcg0LrQsNC70YzQutGD0LvRj9GC0L7RgNCwJywgMTAsIDAKICAgIG1zZ19lcnJvciAgICAgZGIgJ9Ce0YjQuNCx0LrQsCDQstCy0L7QtNCwIScsIDEwLCAwCiAgICBuZXdsaW5lICAgICAgIGRiIDEwLCAwCiAgICAKICAgIDsg0JHRg9GE0LXRgCDQtNC70Y8g0LLQstC+0LTQsAogICAgYnVmZmVyICAgICAgICB0aW1lcyAxNiBkYiAwCiAgICAKc2VjdGlvbiAuYnNzCiAgICA7INCf0LXRgNC10LzQtdC90L3Ri9C1CiAgICBudW0xICAgICAgICAgIHJlc3EgMSAgOyA2NC3QsdC40YLQvdC+0LUg0YfQuNGB0LvQvgogICAgbnVtMiAgICAgICAgICByZXNxIDEKICAgIHJlc3VsdCAgICAgICAgcmVzcSAxCiAgICBjaG9pY2UgICAgICAgIHJlc2IgMQoKc2VjdGlvbiAudGV4dAogICAgZ2xvYmFsIF9zdGFydAoKX3N0YXJ0OgogICAgOyDQntGB0L3QvtCy0L3QvtC5INGG0LjQutC7INC60LDQu9GM0LrRg9C70Y/RgtC+0YDQsAptYWluX2xvb3A6CiAgICA7INCS0YvQstC+0LTQuNC8INC/0YDQuNCz0LvQsNGI0LXQvdC40LUKICAgIG1vdiByYXgsIDEgICAgICAgICAgOyBzeXNfd3JpdGUgKDY0LWJpdCkKICAgIG1vdiByZGksIDEgICAgICAgICAgOyBzdGRvdXQKICAgIG1vdiByc2ksIG1zZ19wcm9tcHQKICAgIG1vdiByZHgsIDMxICAgICAgICAgOyDQtNC70LjQvdCwINGB0YLRgNC+0LrQuAogICAgc3lzY2FsbAogICAgCiAgICA7INCn0LjRgtCw0LXQvCDQv9C10YDQstC+0LUg0YfQuNGB0LvQvgogICAgY2FsbCByZWFkX251bWJlcgogICAgY21wIHJheCwgMCAgICAgICAgICA7INCV0YHQu9C4INCy0LLQtdC70LggMAogICAgamUgZXhpdF9wcm9ncmFtICAgICA7INCy0YvRhdC+0LTQuNC8CiAgICAKICAgIG1vdiBbbnVtMV0sIHJheCAgICAgOyDQodC+0YXRgNCw0L3Rj9C10Lwg0L/QtdGA0LLQvtC1INGH0LjRgdC70L4KICAgIAogICAgOyDQktGL0LLQvtC00LjQvCDQv9GA0LjQs9C70LDRiNC10L3QuNC1INC00LvRjyDQstGC0L7RgNC+0LPQviDRh9C40YHQu9CwCiAgICBtb3YgcmF4LCAxCiAgICBtb3YgcmRpLCAxCiAgICBtb3YgcnNpLCBtc2dfcHJvbXB0CiAgICBtb3YgcmR4LCAzMQogICAgc3lzY2FsbAogICAgCiAgICA7INCn0LjRgtCw0LXQvCDQstGC0L7RgNC+0LUg0YfQuNGB0LvQvgogICAgY2FsbCByZWFkX251bWJlcgogICAgbW92IFtudW0yXSwgcmF4CiAgICAKICAgIDsg0KHQm9Ce0JbQldCd0JjQlQogICAgbW92IHJheCwgW251bTFdCiAgICBhZGQgcmF4LCBbbnVtMl0gICAgIDsg0KHQutC70LDQtNGL0LLQsNC10LwKICAgIG1vdiBbcmVzdWx0XSwgcmF4ICAgOyDQodC+0YXRgNCw0L3Rj9C10Lwg0YDQtdC30YPQu9GM0YLQsNGCCiAgICAKICAgIDsg0JLRi9Cy0L7QtNC40LwgItCg0LXQt9GD0LvRjNGC0LDRgjogIgogICAgbW92IHJheCwgMQogICAgbW92IHJkaSwgMQogICAgbW92IHJzaSwgbXNnX3Jlc3VsdAogICAgbW92IHJkeCwgMTEKICAgIHN5c2NhbGwKICAgIAogICAgOyDQn9GA0LXQvtCx0YDQsNC30YPQtdC8INGH0LjRgdC70L4g0LIg0YHRgtGA0L7QutGDINC4INCy0YvQstC+0LTQuNC8CiAgICBtb3YgcmF4LCBbcmVzdWx0XQogICAgY2FsbCBwcmludF9udW1iZXIKICAgIAogICAgOyDQndC+0LLQsNGPINGB0YLRgNC+0LrQsAogICAgbW92IHJheCwgMQogICAgbW92IHJkaSwgMQogICAgbW92IHJzaSwgbmV3bGluZQogICAgbW92IHJkeCwgMQogICAgc3lzY2FsbAogICAgCiAgICA7INCh0L/RgNCw0YjQuNCy0LDQtdC8LCDQv9GA0L7QtNC+0LvQttC40YLRjCDQu9C4CiAgICBtb3YgcmF4LCAxCiAgICBtb3YgcmRpLCAxCiAgICBtb3YgcnNpLCBtc2dfY29udGludWUKICAgIG1vdiByZHgsIDMxCiAgICBzeXNjYWxsCiAgICAKICAgIDsg0KfQuNGC0LDQtdC8INCy0YvQsdC+0YAKICAgIG1vdiByYXgsIDAgICAgICAgICAgOyBzeXNfcmVhZAogICAgbW92IHJkaSwgMCAgICAgICAgICA7IHN0ZGluCiAgICBtb3YgcnNpLCBjaG9pY2UKICAgIG1vdiByZHgsIDIKICAgIHN5c2NhbGwKICAgIAogICAgOyDQn9GA0L7QstC10YDRj9C10Lwg0LLRi9Cx0L7RgAogICAgbW92IGFsLCBbY2hvaWNlXQogICAgY21wIGFsLCAnMScKICAgIGplIG1haW5fbG9vcCAgICAgICAgOyDQn9GA0L7QtNC+0LvQttCw0LXQvCDQtdGB0LvQuCAnMScKICAgIAogICAgOyDQmNC90LDRh9C1INCy0YvRhdC+0LTQuNC8CiAgICBqbXAgZXhpdF9wcm9ncmFtCgo7INCk0YPQvdC60YbQuNGPINGH0YLQtdC90LjRjyDRh9C40YHQu9CwCnJlYWRfbnVtYmVyOgogICAgcHVzaCByYngKICAgIHB1c2ggcmN4CiAgICBwdXNoIHJkeAogICAgCiAgICA7INCn0LjRgtCw0LXQvCDRgdGC0YDQvtC60YMKICAgIG1vdiByYXgsIDAgICAgICAgICAgOyBzeXNfcmVhZAogICAgbW92IHJkaSwgMCAgICAgICAgICA7IHN0ZGluCiAgICBtb3YgcnNpLCBidWZmZXIKICAgIG1vdiByZHgsIDE2CiAgICBzeXNjYWxsCiAgICAKICAgIDsg0J/RgNC10L7QsdGA0LDQt9GD0LXQvCDRgdGC0YDQvtC60YMg0LIg0YfQuNGB0LvQvgogICAgeG9yIHJheCwgcmF4ICAgICAgICA7INCe0LHQvdGD0LvRj9C10LwgcmF4ICjRgNC10LfRg9C70YzRgtCw0YIpCiAgICB4b3IgcmJ4LCByYnggICAgICAgIDsg0J7QsdC90YPQu9GP0LXQvCByYnggKNGC0LXQutGD0YnQuNC5INGB0LjQvNCy0L7QuykKICAgIG1vdiByY3gsIGJ1ZmZlciAgICAgOyDQo9C60LDQt9Cw0YLQtdC70Ywg0L3QsCDRgdGC0YDQvtC60YMKICAgIApjb252ZXJ0X2xvb3A6CiAgICBtb3YgYmwsIFtyY3hdICAgICAgIDsg0JHQtdGA0ZHQvCDRgdC40LzQstC+0LsKICAgIGNtcCBibCwgMTAgICAgICAgICAgOyDQn9GA0L7QstC10YDRj9C10Lwg0LrQvtC90LXRhiDRgdGC0YDQvtC60LgKICAgIGplIGNvbnZlcnRfZG9uZQogICAgY21wIGJsLCAwICAgICAgICAgICA7INCY0LvQuCDQvdGD0LvRjC3RgtC10YDQvNC40L3QsNGC0L7RgAogICAgamUgY29udmVydF9kb25lCiAgICAKICAgIDsg0J/RgNC+0LLQtdGA0Y/QtdC8INGH0YLQviDRjdGC0L4g0YbQuNGE0YDQsAogICAgY21wIGJsLCAnMCcKICAgIGpsIGlucHV0X2Vycm9yCiAgICBjbXAgYmwsICc5JwogICAgamcgaW5wdXRfZXJyb3IKICAgIAogICAgOyDQn9GA0LXQvtCx0YDQsNC30YPQtdC8INGB0LjQvNCy0L7QuyDQsiDRhtC40YTRgNGDCiAgICBzdWIgYmwsICcwJwogICAgCiAgICA7INCj0LzQvdC+0LbQsNC10Lwg0YLQtdC60YPRidC40Lkg0YDQtdC30YPQu9GM0YLQsNGCINC90LAgMTAKICAgIGltdWwgcmF4LCAxMAogICAgYWRkIHJheCwgcmJ4ICAgICAgICA7INCU0L7QsdCw0LLQu9GP0LXQvCDQvdC+0LLRg9GOINGG0LjRhNGA0YMKICAgIAogICAgaW5jIHJjeCAgICAgICAgICAgICA7INCh0LvQtdC00YPRjtGJ0LjQuSDRgdC40LzQstC+0LsKICAgIGptcCBjb252ZXJ0X2xvb3AKCmNvbnZlcnRfZG9uZToKICAgIHBvcCByZHgKICAgIHBvcCByY3gKICAgIHBvcCByYngKICAgIHJldAoKaW5wdXRfZXJyb3I6CiAgICA7INCS0YvQstC+0LTQuNC8INGB0L7QvtCx0YnQtdC90LjQtSDQvtCxINC+0YjQuNCx0LrQtQogICAgbW92IHJheCwgMQogICAgbW92IHJkaSwgMQogICAgbW92IHJzaSwgbXNnX2Vycm9yCiAgICBtb3YgcmR4LCAxNAogICAgc3lzY2FsbAogICAgCiAgICA7INCS0L7Qt9Cy0YDQsNGJ0LDQtdC8IDAKICAgIHhvciByYXgsIHJheAogICAgam1wIGNvbnZlcnRfZG9uZQoKOyDQpNGD0L3QutGG0LjRjyDQv9C10YfQsNGC0Lgg0YfQuNGB0LvQsApwcmludF9udW1iZXI6CiAgICBwdXNoIHJheAogICAgcHVzaCByYngKICAgIHB1c2ggcmN4CiAgICBwdXNoIHJkeAogICAgCiAgICA7INCf0YDQtdC+0LHRgNCw0LfRg9C10Lwg0YfQuNGB0LvQviDQsiDRgdGC0YDQvtC60YMKICAgIG1vdiByYngsIGJ1ZmZlciArIDE1ICA7INCa0L7QvdC10YYg0LHRg9GE0LXRgNCwCiAgICBtb3YgYnl0ZSBbcmJ4XSwgMCAgICAgOyDQndGD0LvRjC3RgtC10YDQvNC40L3QsNGC0L7RgAogICAgZGVjIHJieAogICAgbW92IGJ5dGUgW3JieF0sIDEwICAgIDsg0J/QtdGA0LXQvdC+0YEg0YHRgtGA0L7QutC4CiAgICBkZWMgcmJ4CiAgICAKICAgIG1vdiByY3gsIDEwICAgICAgICAgICA7INCU0LXQu9C40YLQtdC70YwKICAgIAogICAgOyDQldGB0LvQuCDRh9C40YHQu9C+IDAKICAgIGNtcCByYXgsIDAKICAgIGpuZSBjb252ZXJ0X2xvb3AyCiAgICBtb3YgYnl0ZSBbcmJ4XSwgJzAnCiAgICBkZWMgcmJ4CiAgICAKY29udmVydF9sb29wMjoKICAgIHhvciByZHgsIHJkeCAgICAgICAgICA7INCe0LHQvdGD0LvRj9C10LwgcmR4INC00LvRjyDQtNC10LvQtdC90LjRjwogICAgZGl2IHJjeCAgICAgICAgICAgICAgIDsg0JTQtdC70LjQvCByYXgg0L3QsCAxMCwg0L7RgdGC0LDRgtC+0Log0LIgcmR4CiAgICAKICAgIDsg0J/RgNC10L7QsdGA0LDQt9GD0LXQvCDQvtGB0YLQsNGC0L7QuiDQsiDRgdC40LzQstC+0LsKICAgIGFkZCBkbCwgJzAnCiAgICBtb3YgW3JieF0sIGRsCiAgICBkZWMgcmJ4CiAgICAKICAgIDsg0J/RgNC+0LLQtdGA0Y/QtdC8LCDQt9Cw0LrQvtC90YfQuNC70Lgg0LvQuAogICAgdGVzdCByYXgsIHJheAogICAgam56IGNvbnZlcnRfbG9vcDIKICAgIAogICAgOyDQktGL0LLQvtC00LjQvCDRgdGC0YDQvtC60YMKICAgIGluYyByYnggICAgICAgICAgICAgICA7INCa0L7RgNGA0LXQutGC0LjRgNGD0LXQvCDRg9C60LDQt9Cw0YLQtdC70YwKICAgIG1vdiByY3gsIHJieAogICAgbW92IHJkeCwgYnVmZmVyICsgMTYKICAgIHN1YiByZHgsIHJjeCAgICAgICAgICA7INCS0YvRh9C40YHQu9GP0LXQvCDQtNC70LjQvdGDCiAgICAKICAgIDsg0KLQtdC/0LXRgNGMINC90YPQttC90L4g0L/RgNCw0LLQuNC70YzQvdC+INC/0LXRgNC10LTQsNGC0Ywg0L/QsNGA0LDQvNC10YLRgNGLCiAgICBtb3YgcmF4LCAxICAgICAgICAgICAgOyBzeXNfd3JpdGUKICAgIG1vdiByZGksIDEgICAgICAgICAgICA7IHN0ZG91dAogICAgbW92IHJzaSwgcmJ4ICAgICAgICAgIDsg0YHRgtGA0L7QutCwCiAgICA7IHJkeCDRg9C20LUg0YHQvtC00LXRgNC20LjRgiDQtNC70LjQvdGDCiAgICBzeXNjYWxsCiAgICAKICAgIHBvcCByZHgKICAgIHBvcCByY3gKICAgIHBvcCByYngKICAgIHBvcCByYXgKICAgIHJldAoKOyDQktGL0YXQvtC0INC40Lcg0L/RgNC+0LPRgNCw0LzQvNGLCmV4aXRfcHJvZ3JhbToKICAgIDsg0KHQvtC+0LHRidC10L3QuNC1INC+INCy0YvRhdC+0LTQtQogICAgbW92IHJheCwgMQogICAgbW92IHJkaSwgMQogICAgbW92IHJzaSwgbXNnX2V4aXQKICAgIG1vdiByZHgsIDIwCiAgICBzeXNjYWxsCiAgICAKICAgIDsg0JfQsNCy0LXRgNGI0LDQtdC8INC/0YDQvtCz0YDQsNC80LzRgwogICAgbW92IHJheCwgNjAgICAgICAgICAgIDsgc3lzX2V4aXQgKDY0LWJpdCkKICAgIHhvciByZGksIHJkaSAgICAgICAgICA7INC60L7QtCDQstC+0LfQstGA0LDRgtCwIDAKICAgIHN5c2NhbGw=