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
Другие статьи номера:
Похожие статьи:
В этот день... 9 октября