Книга Код. Тайный язык информатики, страница 75. Автор книги Чарльз Петцольд

Разделитель для чтения книг в онлайн библиотеке

Онлайн книга «Код. Тайный язык информатики»

Cтраница 75

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.

Код

Команда

Вход
Поиск по сайту
Ищем:
Календарь
Навигация