F5
PUSH PSW
F1
POP PSW
Команда PUSH BC сохраняет в стеке значения регистров B и C, а команда POP BC извлекает их. Аббревиатура PSW в последней строке означает слова состояния программы, которые, как вы помните, представляют собой 8-битный регистр, содержащий флаги. Две команды в нижней строке фактически помещают и извлекают из стека содержимое как аккумулятора, так и регистра PSW. Если вы хотите сохранить содержимое всех регистров и значения всех флагов, используйте следующие команды.
PUSH PSW
PUSH BC
PUSH DE
PUSH HL
Когда вам потребуется восстановить содержимое этих регистров, обращайтесь к командам POP в обратном порядке.
POP HL
POP DE
POP BC
POP PSW
Как работает стек? Предположим, что указатель стека равен 8000h. При выполнении команды PUSH BC происходит следующее:
значение указателя стека уменьшается на 1 и становится равным 7FFFh;
содержимое регистра B сохраняется по адресу, соответствующему значению указателя стека, то есть в ячейке 7FFFh;
значение указателя стека уменьшается на 1 и становится равным 7FFEh;
содержимое регистра C сохраняется по адресу, соответствующему значению указателя стека, то есть в ячейке 7FFEh.
Команда POP BC, выполняемая при значении указателя стека, все еще равном 7FFEh, производит обратные операции:
содержимое регистра C загружается из ячейки, адрес которой соответствует значению указателя стека, то есть из ячейки 7FFEh;
значение указателя стека увеличивается на 1 и становится равным 7FFFh;
содержимое регистра B загружается из ячейки, адрес которой соответствует значению указателя стека, то есть из ячейки 7FFFh;
значение указателя стека увеличивается на 1 и становится равным 8000h.
Каждая команда PUSH увеличивает размер стека на два байта. Существует вероятность того, что из-за ошибки в программе размер стека станет настолько большим, что его содержимое начнет сохраняться в ячейках, занятых необходимым программе кодом или данными. Эта проблема называется переполнением стека. Точно так же слишком большое количество команд POP может привести к преждевременному исчерпанию стека.
Если к процессору 8080 подключена память объемом 64 килобайт, имеет смысл установить начальное значение указателя стека равным 0000h. Первая команда PUSH уменьшает это значение на 1 — до FFFFh. После этого стек займет область памяти с самыми высокими адресами, которая максимально удалена от ваших программ, хранящихся, вероятно, начиная с 0000h.
Установить значение указателя стека можно с помощью команды LXI (Load Extended Immediate — расширенная непосредственная загрузка). Перечисленные далее команды также загружают в 16-битные пары регистров два байта, которые следуют за кодом команды.
Код
Команда
01
LXI BC, xxxx
11
LXI DE, xxxx
21
LXI HL, xxxx
31
LXI SP, xxxx
Команда LXI BC,527Ah эквивалентна следующим командам.
MVI B,52
MVI C,7Ah
Однако команда LXI позволяет сэкономить один байт. Кроме того, последняя команда LXI в предыдущей таблице используется для установки конкретного значения для указателя стека. Часто эта команда одной из первых выполняется микропроцессором после его перезапуска.
0000h: LXI SP,0000h
Увеличить и уменьшить на 1 значение пары регистров и указателя стека можно с помощью следующих команд.
Код
Команда
Код
Команда
03
INX BC
0B
DCX BC
13
INX DE
1B
DCX DE
23
INX HL
2B
DCX HL
33
INX SP
3B
DCX SP
Рассмотрим еще несколько 16-битных команд. Следующие команды складывают содержимое 16-битных пар регистров с содержимым пары регистров HL.
Код
Команда
09
DAD HL, BC
19
DAD HL, DE
29
DAD HL, HL
39
DAD HL, SP
Эти команды позволяют сэкономить несколько байтов. Например, первая из них, как правило, требует шесть байт.
MOV A, L
ADD A, C
MOV L, A
MOV A, H
ADC A, B
MOV H, A
Команда DAD обычно используется для вычисления адресов ячеек памяти и влияет только на флаг переноса.
Следующие два кода команд сопровождаются 2-байтовым адресом ячейки памяти и позволяют сохранить содержимое пары регистров HL в соответствующей ячейке, а также загрузить из нее содержимое в пару регистров HL.
Код
Команда
Значение
2h
SHLD [aaaa], HL
Записать число из HL в PC
2Ah
LHLD HL,[aaaa]
Загрузить данные в HL
Содержимое регистра L сохраняется по адресу aaaa, а содержимое регистра H — по адресу aaaa + 1.
Эти две команды загружают в счетчик команд (PC) или в указатель стека (SP) значение из пары регистров HL.
Код
Команда
Значение
E9h
PCHL PC, HL
Загрузить значение HL в PC
F9h
SPHL SP, HL
Загрузить значение HL в SP
Команда PCHL — своеобразная команда перехода. После нее процессор 8080 выполняет команду, код которой занимает ячейку по адресу, записанному в паре регистров HL. Команда SPHL — еще один способ установки значения указателя стека.
Следующие две команды позволяют поменять местами содержимое регистров HL с двумя байтами, являющимися «верхними» элементами стека, или с содержимым пары регистров DE.
Код
Команда