Чарльз Петцольд - Код. Тайный язык информатики
- Название:Код. Тайный язык информатики
- Автор:
- Жанр:
- Издательство:Манн, Иванов и Фербер
- Год:2019
- Город:Москва
- ISBN:978-5-00117-545-2
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Чарльз Петцольд - Код. Тайный язык информатики краткое содержание
Код. Тайный язык информатики - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
значение указателя стека увеличивается на 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.
Код
Команда
Значение
E3h
XTHL HL,[SP]
Поменять местами «верхний» элемент стека и HL
EBh
XCHG HL, DE
Поменять местами DE и HL
Из всех команд перехода для процессора 8080 пока я описал только PCHL. Как вы помните из главы 17, процессор предусматривает регистр под названием «счетчик команд», содержащий адрес ячейки памяти, из которой процессор извлекает следующую команду, подлежащую выполнению. Как правило, счетчик команд заставляет процессор выполнять команды, сохраненные в памяти, последовательно. Однако так называемые команды перехода , или ветвления, позволяют процессору отклониться от этого главного курса. Эти команды загружают в счетчик команд другое значение, поэтому следующая команда извлекается процессором из какой-то другой области памяти.
Несмотря на удобство обычной команды перехода , команды условного перехода более удобные, поскольку заставляют процессор переходить к другому адресу, основываясь на значении определенного флага, например флага переноса или флага нуля. Именно реализация условного перехода превратила автоматизированный сумматор из главы 17 в универсальный цифровой компьютер.
В процессоре 8080 имеется пять флагов, четыре из которых используются для реализации условных переходов. Набор команд 8080 содержит девять команд безусловных и условных переходов, зависящих от того, чему равны флаги нуля, переноса, четности и знака: 1 или 0.
Прежде чем продемонстрировать эти команды, хочу познакомить вас с двумя другими типами команд, имеющих отношение к переходу. Первая — CALL (вызов), она аналогична команде перехода, за исключением того, что перед загрузкой нового адреса в счетчик команд процессор сохраняет предыдущий адрес. Где он сохраняет этот адрес? Разумеется, в стеке!
Эта стратегия подразумевает, что команда вызова сохраняет информацию о том месте, откуда был совершен переход . Сохраненный адрес позволяет процессору вернуться в исходное местоположение. Команда для совершения обратного перехода называется RET (Return — вернуться). Она удаляет из стека 2-байтное значение и загружает его в счетчик команд.
Команды CALL и RET — чрезвычайно важные функции любого процессора, позволяющие программисту реализовывать подпрограммы, которые являются часто используемыми фрагментами кода. (Под словом « часто» обычно я имею в виду «более одного раза».) Подпрограммы — основные организующие элементы программ на языке ассемблера.
Обратимся к примеру. В процессе написания программы на языке ассемблера у вас возникает необходимость в перемножении двух байтов. Вы пишете код для выполнения этой операции, а затем продолжаете работу с программой. На каком-то этапе вам снова требуется перемножить два байта. Поскольку вы уже знаете, как это сделать, можно просто использовать те же команды снова и снова. Собираетесь ли вы во второй раз ввести эти команды в память? Надеюсь, что нет, поскольку это пустая трата времени и памяти. Вместо этого вам следует просто перейти к предыдущему фрагменту кода. Правда, в данном случае обычная команда перехода не сработает, поскольку она не позволяет вернуться к тому месту, с которого был совершен переход. Именно в этом случае пригодятся команды CALL и RET.
Читать дальшеИнтервал:
Закладка: