Чарльз Петцольд - Код. Тайный язык информатики
- Название:Код. Тайный язык информатики
- Автор:
- Жанр:
- Издательство:Манн, Иванов и Фербер
- Год:2019
- Город:Москва
- ISBN:978-5-00117-545-2
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Чарльз Петцольд - Код. Тайный язык информатики краткое содержание
Код. Тайный язык информатики - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
флаг знака устанавливается в 1, если старший бит результата равен 1, то есть если результат отрицательный;
флаг нуля устанавливается в 1, если результат равен 0;
флаг четности устанавливается в 1, если результат четен , то есть выраженный в двоичном формате результат содержит четное количество 1; флаг четности устанавливается в 0, если результат нечетен ; флаг четности иногда используется для грубой проверки результата на наличие ошибок; при написании программ для процессора 8080 этот флаг используется редко;
флаг переноса устанавливается в 1, если в результате выполнения команды ADD или ADC возникает бит переноса либо в результате выполнения команд SUB и SBB бит переноса не возникает (такая реализация флага переноса отличается от того, как он был реализован в компьютере из главы 17);
флаг вспомогательного переноса устанавливается в 1, если в результате выполнения команды возникает перенос из младшей тетрады в старшую; этот флаг используется только для команды DAA (Decimal Adjust Accumulator — десятичная коррекция аккумулятора).
На флаг переноса непосредственно влияют две команды.
Код
Команда
Значение
37
STC
Установить флаг переноса в 1
3F
CMC
Дополнить флаг переноса до 1 или инвертировать флаг переноса
В отличие от компьютера из главы 17, который тоже выполнял команды ADD, ADC, SUB и SBB (хотя и не с такой же степенью гибкости), процессор 8080 способен еще и на булевы операции И, ИЛИ и исключающее ИЛИ. За выполнение арифметических и логических операций отвечает арифметико-логическое устройство процессора.
Код
Команда
Код
Команда
A0
AND A, B
B0
OR A, B
A1
AND A, C
B1
OR A, C
A2
AND A, D
B2
OR A, D
A3
AND A, E
B3
OR A, E
A4
AND A, H
B4
OR A, H
A5
AND A, L
B5
OR A, L
A6
AND A,[HL]
B6
OR A,[HL]
A7
AND A, A
B7
OR A, A
A8
XOR A, B
B8
CMP A, B
A9
XOR A, C
B9
CMP A, C
AA
XOR A, D
BA
CMP A, D
AB
XOR A, E
BB
CMP A, E
AC
XOR A, H
BC
CMP A, H
AD
XOR A, L
BD
CMP A, L
AE
XOR A,[HL]
BE
CMP A,[HL]
AF
XOR A, A
BF
CMP A, A
Команды AND, OR и XOR выполняются побитово , то есть отдельно над каждой парой битов. Например, в результате выполнения следующих команд значение в аккумуляторе будет равно 05h.
MVI A,0Fh
MVI B,55h
AND A, B
Если бы последней была команда OR, то результат был бы равен 5Fh; если бы последней была команда XOR — 5Ah.
Команда CMP (Compare — сравнить) аналогична команде SUB, за исключением того, что результат не сохраняется в аккумуляторе. Другими словами, команда CMP выполняет вычитание, а затем удаляет результат. В чем же смысл? Во флагах! Флаги говорят о том, как два сравниваемых байта соотносятся. Рассмотрим, например, следующие команды.
MVI B,25h
CMP A, B
После их выполнения содержимое аккумулятора (А) остается прежним. Если значение в A равно 25h, будет установлен флаг нуля, а если значение в A меньше 25h — флаг переноса.
Для восьми арифметических и логических операций также существуют версии, которые выполняются непосредственно над байтами.
Код
Команда
Код
Команда
C6
ADI A, xx
E6
ANI A, xx
CE
ACI A, xx
EE
XRI A, xx
D6
SUI A, xx
F6
ORI A, xx
DE
SBI A, xx
FE
CPI A, xx
Например, две приведенные выше строки можно заменить следующей.
CPI A,25h
Вот еще две команды для процессора 8080.
Код
Команда
27
DAA
2F
CMA
Команда CMA (Complement Accumulator — дополнить аккумулятор) выполняет дополнение значения в аккумуляторе до 1. Каждый 0 обращается в 1, а 1 — в 0. Если в аккумуляторе содержится значение 01100101, то после исполнения команды CMA в нем будет содержаться значение 10011010. Этого же результата можно достичь и с помощью следующей команды.
XRI A, FFh
Упомянутая выше команда DAA (Decimal Adjust Accumulator — десятичная коррекция аккумулятора), вероятно, является самой сложной в наборе команд процессора 8080. Специально для нее в микропроцессоре предусмотрено небольшое устройство.
DAA помогает программисту выполнять арифметические операции над десятичными числами в кодировке BCD (binary-coded decimal — десятичное в двоичной кодировке), где каждая тетрада может принимать значение только в диапазоне от 0000 до 1001, то есть от 0 до 9 в десятичном выражении. В формате BCD в восьми битах байта могут храниться две десятичные цифры.
Предположим, что в аккумуляторе содержится BCD-значение 27h, которое фактически соответствует десятичному значению 27, а в регистре B содержится BCD-значение 94h. (Обычно шестнадцатеричное значение 27h эквивалентно десятичному значению 39.) В результате выполнения следующих команд в аккумуляторе будет содержаться значение BBh, которое, разумеется, не является BCD-значением, поскольку в кодировке BCD-значение тетрады не может превышать 9.
MVI A,27h
MVI B,94h
ADD A, B
Однако при выполнении команды DAA в аккумулятор помещается значение 21h и устанавливается флаг переноса, поскольку сумма десятичных чисел 27 и 94 равна 121. Эта команда может пригодиться для арифметических операций над числами в кодировке BCD.
Часто возникает необходимость в прибавлении 1 к значению или в вычитании 1 из значения. В программе для выполнения умножения, описанной в главе 17, нужно вычесть из значения 1, и мы делали это, прибавляя значение FFh, которое является дополнением до 2 числа –1. Процессор 8080 предусматривает специальные команды для увеличения на 1 (инкрементирования) и уменьшения на 1 (декрементирования) значения в регистре или в ячейке памяти.
Код
Команда
Код
Команда
04
INR B
05
DCR B
0С
INR C
0D
DCR C
14
INR D
15
DCR D
1С
INR E
1D
DCR E
24
INR H
25
DCR H
2C
INR L
2D
DCR L
34
INR [HL]
35
DCR [HL]
3C
INR A
3D
DCR A
Однобайтовые команды INR и DCR влияют на все флаги, кроме флага переноса.
Набор команд процессора 8080 также включает четыре команды циклического сдвига , которые сдвигают содержимое аккумулятора на один бит влево или вправо.
Код
Команда
Значение
07
RLC
Сдвинуть аккумулятор влево
0F
RRC
Сдвинуть аккумулятор вправо
17
RAL
Сдвинуть аккумулятор влево через бит переноса
1F
RAR
Сдвинуть аккумулятор вправо через бит переноса
Эти команды влияют только на флаг переноса.
Предположим, что аккумулятор содержит значение A7h, или 10100111 в двоичном формате. Команда RLC сдвигает биты влево. Старший бит, выталкиваемый за левую границу разрядной сетки, становится младшим, а также определяет состояние флага переноса. В результате получается значение 01001111, а флаг переноса устанавливается в 1. Команда RRC точно так же сдвигает биты вправо. После выполнения команды RRC значение 10100111 превращается в 11010011, а флаг переноса опять устанавливается в 1.
Читать дальшеИнтервал:
Закладка: