Ассемблер
Язык машинных кодов понятен процессору, но неудобен для работы программисту поскольку команды трудно запоминаются и читаются. Гораздо удобнее символьное представление команд, когда символы команды напоминают о её действиях, а двухбайтные операнды и адреса в командах пишутся в нормальном виде (начиная слева, от старших байт). Такая форма представления команд используется в языке Ассемблер. Символы, представляющие команды, называются мнемокодами. Характерной особенностью языка Ассемблер, определяющей его принадлежность в языкам нижнего уровня, является то, что каждой команде Ассемблера соответствует одна и только одна машинная команда.
Пример 1.6
Адрес Число Мнемокод
0800 78 MOV A,B
MOV – сокращёние от MOVe (переместить). После пробела указываются операнды: сначала – операнд-приёмник (регистр A), а затем – операнд-источник (регистр B). Операнды разделяются друг от друга запятой.
Пример 1.7
Адрес Число Мнемокод
0801 06 4С MVI B,4C
MVI – сокращёние от MOVe Immediate (переместить непосредственно). После пробела указываются операнды: сначала – операнд-приёмник (регистр B), а затем – операнд-источник (число 4C).
Пример 1.8
Адрес Число Мнемокод
0803 D3 F0 OUT F0
OUT – сокращёние от OUTput (вывести). После пробела указывается операнд-приёмник через адрес порта вывода F0. Источник (выводимый байт) для команд вывода всегда находится в аккумуляторе, и поэтому сведений о нём в мнемокоде нет.
Пример 1.9
Адрес Число Мнемокод
0805 32 01 0B STA 0B01
STA – сокращёние от STore A direct (записать аккумулятор прямым методом адресации). После пробела указывается операнд-приёмник через определение его адреса в памяти (0B01). Источник в команде такого типа всегда находится в аккумуляторе, и поэтому сведений о нём в мнемокоде нет.
Программист пишет программу из процессорных команд сначала в удобной для него форме – на языке Ассемблера. При этом ему не обязательно сразу определять конкретные адреса памяти для размещения своей программы и её данных. Можно указать их в виде переменных с присвоением специальных имён.
Пример 1.10
Программа инвертирования чисел, в количестве Cnt_1, размещённых в последовательно расположенных ячейках памяти, начиная с адреса Adr_dat, может быть представлена на Ассемблере следующим образом
Метка Мнемокод Комментарий
Beg: LXI H,Adr_dat;записать в HL число Adr_dat
MVI B,Cnt_1;записать в B число Cnt_1
M00: MOV A,M; принять очередной байт из памяти в A
CMA; проинвертировать биты байта в A
MOV M,A; проинвертированный байт записать на место
INX H; инкрементировать указатель ячеек в HL
DCR B; декрементировать счётчик байтов в B
JNZ M00; проверить завершение счёта и перейти к M00
; когда счёт байтов не завершён
HLT; когда счёт байтов завершён – останов
Затем программист решает какое место в памяти займут программа и её данные. После этого выполняется трансляция исходной программы – преобразование мнемокодов в соответствующие числовые коды команд, то есть преобразование ассемблерных команд в машинные команды.
Если выбраны Beg=0800, Adr_dat=0B00, Cnt_1=08, то оттранслированная программа будет иметь следующий вид
Адрес Число Метка Мнемокод Комментарий
0800 21 00 0B Beg: LXI H,0B00
0803 06 08 MVI B,08
0805 7E M00: MOV A,M
0806 2F CMA
0807 77 MOV M,A
0808 23 INX H
0809 05 DCR B
080A C2 05 08 JNZ M00
080D 76 HLT
Трансляция ассемблерной программы может быть выполнена программистом вручную при помощи справочных таблиц с мнемониками и кодами команд. Если в подготовке программ для процессора 8080, в качестве средства автоматизации программирования, применяется компьютер, то трансляция также может быть выполнена специальной компьютерной программой называемой транслятором Ассемблера или просто Ассемблером. Программист подготавливает исходный текст в таком виде, который требует транслятор. Программа Ассемблер предполагает определённый формат представления исходной программы, а также – наличие в исходном тексте программы дополнительных команд, управляющих процессом трансляции, но не транслируемых в выходной листинг (в отличие от мнемокодов). Они именуются директивами Ассемблера.