Nicron #07
14 ноября 1996

Программирование - курс изучения ассемблера от Wlodek Black, продолжение.

╔═════════════════════════════════════════════════════════════╗
║▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░Курс обучения ассемблеру░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒║
╚═════════════════════════════════════════════════════════════╝

(c) WLODEK BLACK

		007h. КОМАНДЫ 16-РАЗРЯДНЫХ ПЕРЕСЫЛОК.

Их не очень много:
_______________________________________________
LD HL,d16    LD HL,(addr)    LD (addr),HL
LD DE,d16        -"-              -"-
LD BC,d16        -"-              -"-
LD IX,d16        -"-              -"-
LD IY,d16        -"-              -"-
LD SP,d16        -"-              -"-

(d16 - 16-разрядная константа).
_______________________________________________

LD SP,HL
LD SP,IX
LD SP,IY
___________

EX DE,HL   - обменяться значениями HL и DE.
____________________________________________

EX (SP),HL - обменяться значениями HL и словом с вершины стека.

EX (SP),IX
EX (SP),IY
______________________________________________________________

Команды с парой HL наиболее коротки и эффективны.

	  Дополнение к теме "Восьмиразрядные пересылки".
		Команды групповых пересылок.

Эта группа команд очень скромна по количеству,  но  чрезвычайно
важна из-за огромной эффективности входящих  в  нее  всего  4-х
команд:

LDIR (Load with Increment of Register)
LDDR (Load with Decrement of Register)
LDI
LDD
Все эти команды используют регистровые пары HL, DE и BC
и регистр флагов F:
HL = адрес "откуда"
DE = адрес "куда"
BC = сколько байт пересылать.

LDIR работает на основе инкремента, то есть "увеличения  на еди-
ницу" - каждый элементарный этап операции пересылает байт,  при
этом текущие адреса источника и приемника увеличиваются на 1.
Счетчик на паре BC уменьшает свое значение на 1.Строгий расклад
операции LDIR по последовательности выполняемых действий таков:
1. Берется байт с адреса (HL);
2. Байт заносится по адресу (DE);
3. HL и DE увеличиваются на 1;
4. Значение BC уменьшается на 1;
5. Проверяется, равно ли BC нулю. Если да, то сбрасывается  в 0
   флаг P/V, и операция завершается. Если нет, то:
6. Счетчик команд уменьшается на 2 (на длину кода команды);
7. Код команды заново считывается из памяти, и процесс  повторя-
ется с шага 1.

Вникнув в тонкости приведенной последовательности,можно сделать
ряд важных выводов:
- на выходе из LDIR: HL и DE указывают на  адреса,  на  единицу
  большие адресов концов пересылаемого блока и принимающей обла-
  сти; флаг P/V равен 0;
- регистр-аккумулятор не используется и не меняет своего текуще-
  го значения;
- LDIR является не элементарной командой, а, по  сути,  сложным
  оператором цикла. Тот факт, что после пересылки каждого байта
  код команды заново считывается из памяти, влечет за собой  по
  крайней мере два следствия. Одно из них очевидное: пересылать
  блок кодов в ОЗУ с перекрытием самой команды LDIR  невозможно.
  Второе следствие более хитрое: работа команды LDIR  может пре-
  рываться прерываниями (звучит коряво, но как еще сказать?).

Команда LDDR пересылает блок кодов в сторону уменьшения адресов;
в остальном она аналогична LDIR. Наличие команд как LDIR, так и
LDDR позволяет эффективно пересылать блоки  кодов  с  частичным
наложением области-приемника на область-источник.

LDI и LDD выполняют пересылку лишь одного байта за одно  обраще-
ние к команде. О завершении пересылки всего блока можно  судить
по флагу P/V - в этом случае он будет сброшен в 0.

Команды групповой пересылки - единственные, выполняющие пересыл-
ки из памяти в память, минуя 8-разрядные регистры общего  назна-
чения.

						(c)WLODEK BLACK




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Swapping - От письма до бандероли или как стать настоящим swaper'ом.
Рабочий стол - Программа оцифровки звука "Digital Factory v1.0" (COVOX).
HINTS! - 59 паролей к игре LEMMINGS.

В этот день...   17 ноября