Ассемблер
Как называются короткие слова в языке ассемблера
Короткие слова в языке ассемблера чаще всего называют мнемониками инструкций. Например, mov, add, sub, cmp, jmp — это мнемоники, то есть удобные человеку короткие имена машинных инструкций. Но в ассемблерном коде есть не только мнемоники: рядом встречаются директивы, регистры, метки, операнды и псевдооператоры
Мнемоники инструкций
Мнемоника — это короткое имя инструкции процессора:
mov eax, 5
add eax, 3
cmp eax, 8
jmp done
Здесь:
mov— переместить или загрузить значение;add— сложить;cmp— сравнить;jmp— перейти.
Ассемблер переводит эти мнемоники в машинный код. Процессор не «читает слово mov» как человек. Он выполняет байты машинной инструкции, которые получились после сборки
Регистры
Слова вроде eax, rax, al, rcx — это имена регистров:
mov eax, 10
Регистр — маленькое быстрое хранилище внутри процессора. В разных архитектурах имена регистров отличаются. В x86 встречаются eax, ebx, ecx, в Z80 — A, B, HL, в ARM — r0, r1, sp, lr
Директивы ассемблера
Слова вроде section, global, db, equ часто являются директивами, а не инструкциями процессора:
section .data
message db "Hello", 0
length equ $ - message
Директивы нужны самой программе-ассемблеру: где разместить данные, какую метку сделать видимой, сколько байт выделить. Процессор напрямую не выполняет section как инструкцию
Метки
Метка — это имя места в коде:
loop_start:
sub ecx, 1
jnz loop_start
loop_start не инструкция и не регистр. Это адрес, к которому можно перейти
Операнды
Операнды — это то, с чем работает инструкция:
add eax, 3
Здесь eax и 3 — операнды. Один операнд может быть регистром, другой числом, памятью или адресом
Почему названия отличаются в учебниках
В русских учебниках можно встретить слова «мнемоника», «команда», «инструкция», «оператор», «директива». В разговорной речи mov часто называют командой. Точнее говорить: mov — мнемоника машинной инструкции, а section — директива ассемблера
Как проверить себя на примере
Возьмите строку:
loop_start:
mov eax, [value]
Разберите ее так:
loop_start— метка;mov— мнемоника инструкции;eax— регистр;[value]— операнд с обращением к памяти;value— имя данных или метка в памяти.
Если вы можете разложить строку на такие части, читать ассемблерный код станет гораздо проще
Частые ошибки
Называют все слова командами
Для первого знакомства это терпимо, но позже важно отделять инструкции процессора от директив ассемблера
Путают регистр и переменную
eax — регистр процессора, а message может быть меткой данных
Думают, что метка выполняется
Метка только обозначает место. Выполняются инструкции после нее
Что почитать дальше по ассемблеру
Если нужен общий маршрут по теме, откройте рубрику ассемблеру. Для соседних задач пригодятся эти разборы:
- Как сложить 2 числа на языке ассемблера
- CMP, JMP, JE, JNZ: условия и циклы в ассемблере
- I8080, AVR и STM32 на ассемблере: когда идти в нишевые ветки
- MASM, NASM, FASM, SASM: что выбрать новичку
Как проверить результат на практике
Для ассемблера важно сначала понять, под какую среду написан пример: DOSBox/TASM, Linux x64/NASM, Visual Studio/MASM или микроконтроллер. Один и тот же смысл может записываться разным синтаксисом, поэтому не переносите команды между средами вслепую. Создайте отдельную папку для примера, сохраните файл с расширением .asm, выполните сборку именно тем инструментом, который указан в уроке, и сравните вывод или состояние регистров с ожидаемым результатом
Если пример не собирается, читайте первую ошибку ассемблера: обычно она указывает на строку, неизвестную инструкцию, неверную метку, неправильную секцию или конфликт синтаксиса. Исправляйте одну ошибку за раз. В ассемблере это особенно важно, потому что маленькая опечатка в метке, регистре или размере операнда может полностью изменить поведение программы