Ассемблер

Как сложить 2 числа на языке ассемблера

Чтобы сложить 2 числа на языке ассемблера, обычно кладут первое число в регистр, затем инструкцией add прибавляют второе. Результат остается в том же регистре. Главная сложность для новичка не в сложении, а в том, где лежат числа: в регистрах, в памяти или во входной строке

Самый простой пример

mov eax, 5
add eax, 3

После этих двух строк в eax будет 8

Что происходит:

  • mov eax, 5 кладет число 5 в регистр eax;
  • add eax, 3 прибавляет 3 к eax;
  • результат записывается обратно в eax.

Так работает большинство простых арифметических операций: один из операндов одновременно является местом результата

Сложение двух чисел из памяти

section .data
    a dd 5
    b dd 3

section .text
    mov eax, [a]
    add eax, [b]

Здесь a и b лежат в памяти. Квадратные скобки означают «взять значение по адресу». Без скобок вы бы работали с адресом или символом, а не с числом

После add eax, [b] в eax будет сумма

Что происходит с флагами

Инструкция add меняет флаги процессора. Для новичка важны:

  • carry flag — если было беззнаковое переполнение;
  • overflow flag — если было знаковое переполнение;
  • zero flag — если результат стал нулем;
  • sign flag — если результат выглядит отрицательным в знаковой интерпретации.

Если вы просто складываете маленькие числа, флаги можно сначала не трогать. Но в реальных задачах они помогают понять, произошло ли переполнение

Пример с байтами

mov al, 250
add al, 10

al — 8-битный регистр. Он не может хранить число 260. Значение переполнится, а carry flag покажет, что результат не поместился в 8 бит. Это одна из причин, почему в ассемблере важно понимать размер регистра

Как вывести результат

Сложить числа проще, чем вывести сумму на экран. Если результат уже в регистре, его нужно преобразовать в строку и вызвать вывод. Поэтому в учебных задачах часто сначала проверяют результат через отладчик или код завершения программы

Для первого шага достаточно научиться складывать и смотреть регистр в отладчике. Потом можно отдельно изучить вывод числа

Частые ошибки

Путают адрес и значение

a и [a] — не одно и то же. [a] означает значение в памяти

Используют слишком маленький регистр

Если сумма не помещается в al, используйте ax, eax или rax

Ждут автоматический вывод

Инструкция add только считает. Чтобы показать результат, нужен отдельный код вывода

Не учитывают знаковость

Одни и те же биты могут трактоваться как signed или unsigned. Для сложения это особенно важно при проверке переполнения

Что почитать дальше по ассемблеру

Если нужен общий маршрут по теме, откройте рубрику ассемблеру. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x