Ассемблер для чайников: первый код без страха

Первый код на ассемблере лучше писать не как полноценную программу с вводом, выводом и системными вызовами, а как маленький набор инструкций, где видно, что происходит с регистрами

Иначе новичок сразу тонет в деталях операционной системы. Наша цель проще: понять mov, add, sub, cmp и идею перехода

Мини-сценарий

Представим, что нужно посчитать:

10 + 5 - 3

В условном x86-подобном синтаксисе:

mov ax, 10
add ax, 5
sub ax, 3

После выполнения в ax будет 12

Что делает mov

mov ax, 10

mov копирует значение. Здесь мы кладем число 10 в регистр ax

Важно: mov не "двигает" значение так, что источник исчезает. Это скорее "скопировать"

Что делает add

add ax, 5

Прибавляет 5 к текущему значению ax

Если в ax было 10, станет 15

Что делает sub

sub ax, 3

Вычитает 3 из ax

Если было 15, станет 12

Добавляем сравнение

Теперь проверим, равно ли значение 12:

cmp ax, 12

cmp сравнивает значения и выставляет флаги процессора. Сам ax не меняется

После cmp можно сделать условный переход:

je equal_label

je означает jump if equal — перейти, если равно

Маленькая логика

mov ax, 10
add ax, 5
sub ax, 3

cmp ax, 12
je result_is_12

mov bx, 0
jmp end

result_is_12:
mov bx, 1

end:

Идея:

  • считаем значение в ax;
  • сравниваем с 12;
  • если равно, кладем 1 в bx;
  • если не равно, кладем 0.

Это уже похоже на if из C++:

if (result == 12) {
    flag = 1;
} else {
    flag = 0;
}

Почему нет вывода на экран

Потому что вывод — это уже разговор с операционной системой или учебной библиотекой. Для первого урока важнее понять саму механику:

  • регистр;
  • операция;
  • сравнение;
  • флаг;
  • переход.

Когда это ясно, Hello World перестает быть стеной текста

Как тренироваться

Не пытайся учить список команд как словарь. Бери одну задачу:

Положить число, прибавить, сравнить, перейти.

И прогоняй ее в эмуляторе, где видно регистры

План:

  1. Записать ожидаемый результат.
  2. Выполнить инструкции.
  3. Проверить регистры.
  4. Изменить одно число.
  5. Снова предсказать результат.

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

Думать, что cmp меняет регистр

cmp ax, 12 не меняет ax. Он выставляет флаги

Переходить не туда

Метка должна существовать:

je result_is_12

и ниже:

result_is_12:

Копировать код не под ту архитектуру

Команды и регистры зависят от архитектуры. ax — x86-семейство, не универсальный регистр всех процессоров

Сразу брать сложный Hello World

Можно, но для первого понимания проще начать с регистров и арифметики

Мини-задания

  1. Сделай в ax значение 20 через mov и add.
  2. Вычти 4.
  3. Сравни с 16.
  4. Если равно, положи в bx число 1.
  5. Если не равно, положи 0.

Потом измени одно число так, чтобы условие стало ложным

Ответы на эти вопросы могут быть для вас полезными

С чего начать ассемблер с нуля?

С регистров и простых инструкций: mov, add, sub, cmp, jmp. Не обязательно начинать с вывода текста

Что такое регистр?

Это маленькая быстрая ячейка внутри процессора, с которой инструкции работают напрямую

Что делает cmp?

Он сравнивает значения и выставляет флаги, но не меняет сами операнды

Почему код зависит от архитектуры?

Потому что разные процессоры имеют разные регистры, инструкции и правила

Можно ли учить без установки?

Да, первые инструкции удобно выполнять в online-эмуляторе

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

Если вы собираете тему по шагам, рядом лучше открыть:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x