Ассемблер
Как сделать калькулятор в ассемблере
Чтобы сделать калькулятор в ассемблере, нужно собрать несколько частей: ввод строки, преобразование строки в число, выбор операции, арифметика и вывод результата. Сами операции add, sub, mul, div простые. Главная сложность — ввод и вывод, потому что пользователь вводит символы, а процессору нужны числа
Минимальная логика калькулятора
Для первого проекта не делайте сложный парсер выражений. Начните с формата:
число1 операция число2
Например:
12 + 5
Программа должна:
- Прочитать ввод.
- Получить первое число.
- Получить знак операции.
- Получить второе число.
- Выполнить операцию.
- Преобразовать результат в строку.
- Вывести результат.
Арифметика в регистрах
Сложение:
mov eax, [a]
add eax, [b]
Вычитание:
mov eax, [a]
sub eax, [b]
Умножение:
mov eax, [a]
mul dword [b]
Деление требует аккуратной подготовки регистров:
mov eax, [a]
xor edx, edx
div dword [b]
Для беззнакового 32-битного деления edx:eax — делимое, поэтому edx очищают
Самая важная часть: строка в число
Если пользователь ввел "123", это не число 123, а три символа. Нужно пройти по символам и сделать:
result = result * 10 + digit
где digit получается вычитанием '0' из символа
Вывод результата
Результат в eax нужно превратить обратно в строку. Обычно число делят на 10, остатки превращают в символы и выводят в обратном порядке. Поэтому калькулятор полезен как учебный проект: он соединяет сразу несколько базовых тем
Как упростить первый вариант
Сделайте сначала калькулятор без пользовательского ввода:
a dd 12
b dd 5
И посмотрите результат в отладчике. Потом добавьте вывод числа. Только после этого добавляйте ввод с клавиатуры. Так вы не будете одновременно чинить арифметику, парсер и вывод
Мини-план первой версии
Первая версия калькулятора может быть такой:
a = 12
b = 5
operation = '+'
посчитать result
завершить программу с кодом result или посмотреть регистр в отладчике
Вторая версия добавляет вывод результата. Третья версия добавляет чтение строки. Такой порядок намного проще, чем сразу писать интерактивный калькулятор с меню
Проверка результата
Для сложения и вычитания смотрите регистр результата. Для умножения проверяйте не только младшую часть, но и старшую, если используете mul. Для деления проверяйте частное и остаток отдельно
Частые ошибки
Начинают с выражений вида 2+3*4
Для такого формата нужен парсер и приоритет операций. Начните с одной операции
Путают символы и числа
Символ '5' нужно превратить в число 5
Не проверяют деление на ноль
Перед div обязательно проверьте второй операнд
Не очищают edx перед div
Для 32-битного деления мусор в edx сломает результат
Что почитать дальше по ассемблеру
Если нужен общий маршрут по теме, откройте рубрику ассемблеру. Для соседних задач пригодятся эти разборы:
- Как сделать ОС на ассемблере
- Как сделать цикл в ассемблере
- CMP в ассемблере
- CMP в ассемблере: как работает сравнение
Как проверить результат на практике
Для ассемблера важно сначала понять, под какую среду написан пример: DOSBox/TASM, Linux x64/NASM, Visual Studio/MASM или микроконтроллер. Один и тот же смысл может записываться разным синтаксисом, поэтому не переносите команды между средами вслепую. Создайте отдельную папку для примера, сохраните файл с расширением .asm, выполните сборку именно тем инструментом, который указан в уроке, и сравните вывод или состояние регистров с ожидаемым результатом
Если пример не собирается, читайте первую ошибку ассемблера: обычно она указывает на строку, неизвестную инструкцию, неверную метку, неправильную секцию или конфликт синтаксиса. Исправляйте одну ошибку за раз. В ассемблере это особенно важно, потому что маленькая опечатка в метке, регистре или размере операнда может полностью изменить поведение программы