
Онлайн книга «Код. Тайный язык информатики»
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. Код Команда |