Nicron #11
12 декабря 1996

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

 ╔═══════════════════════════════════════════════════════════╗
 ║     ▒▒▒   ▒▒▒  ▒▒▒ ▒▒▒▒ ▒▒   ▒▒ ▒▒▒▒▒  ▒▒▒▒ ▒▒▒▒ ▒▒▒▒▒    ║
 ║    ▒▒ ▒▒ ▒▒   ▒▒   ▒▒   ▒▒▒ ▒▒▒ ▒▒    ▒▒ ▒▒ ▒▒   ▒▒ ▒▒    ║
 ║    ▒▒▒▒▒ ▒▒   ▒▒   ▒▒▒▒ ▒▒ ▒ ▒▒ ▒▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒▒▒▒    ║
 ║    ▒▒ ▒▒ ▒▒   ▒▒   ▒▒   ▒▒   ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒   ▒▒       ║
 ║    ▒▒ ▒▒  ▒▒▒  ▒▒▒ ▒▒▒▒ ▒▒   ▒▒ ▒▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒   Z80 ║
 ╚═══════════════════════════════════════════════════════════╝
(Продолжение).

(C) WLODEK BLACK
		     00Ah. КОМАНДЫ СДВИГА.

Слово  "сдвиг"  идеально отражает сущность одноименных операций.
Содержимое регистра или ячейки памяти побитно сдвигается  в сто-
рону старших ("влево") или младших ("вправо") разрядов.  В зави-
симости от того, что происходит при этом с крайними (7-м и 0-м)
битами, различают циклические, арифметические  и  прочие сдвиги.
Имеется также весьма специфическая команда  двоично-десятичного
сдвига.
Команды сдвига  находят применение  в преобразованиях данных из
параллельной формы в последовательную и наоборот, например, при
подготовке их к передаче по сетям связи; при побитной обработке
данных и так далее.

		      Циклические сдвиги.

Механизм циклического сдвига влево таков:
                   ------------------->-------------------
                  |                                       |
                  |                                       |
   Carry<------- D7<- D6<- D5<- D4<- D3<- D2<- D1<- D0<---

Биты сдвигаются влево; бит 7 переходит  в бит 0  и одновременно
копируется во флаг переноса C.Нетрудно вообразить происхождение
названия "циклический" для такого сдвига. Биты регистра действи-
тельно перемещаются по замкнутому кругу,  а крайний бит попутно
копируется в признак переноса.
Аналогичный сдвиг вправо:

    --> D7 ->D6 ->D5 ->D4 ->D3 ->D2 ->D1 ->D0 -------->Carry
   |                                           |
   |                                           |
    --------------------<----------------------

Основа мнемоники для команд циклического сдвига  с ответвлением
в признак переноса - RLC (Rotate Left and to Carry) и RRC. Адре-
сация - все возможные варианты:
RLC A		RLC H
RLC B		RLC L
RLC C		RLC (HL)
RLC D		RLC (IX+nn) - 4-х байтовая команда.
RLC E		RLC (IY+nn).	Так же и для RRC.

Существенный нюанс: для  аккумулятора  имеются  более  короткие
команды RLCA и RRCA. Эти однобайтовые команды достались  Z80  в
наследство от его прародителя Intel 8080,в котором сдвиги можно
было производить только в аккумуляторе. Команды  RLCA и RLC A -
разные. RLC A - двухбайтовая команда  процессора  Z80;  в  этой
команде аккумулятор выступает как равный среди равных остальных
регистров. RLC A влияет на все флаги, а RLCA - только  на  флаг
переноса. Больше  (кроме, конечно,  длины и времени исполнения)
эти команды ничем не различаются.
RLC и RRC, выполняемые для других регистров и памяти, также вли-
яют на все флаги. Флаг P/V отражает четность результата.

     Сдвиги через признак переноса - "обыкновенные" сдвиги.

"Обыкновенными" их можно назвать исходя из того, что в их мнемо-
никах присутствуют только обозначение сдвига и его направление:
RR, RL, RRA, RLA.
        --------------------------->------------------------
       :                                                    |
RL:    :                                                    |
        ---Carry<- D7<- D6<- D5<- D4<- D3<- D2<- D1<- D0<---

    ---------------------------<----------------------------
   |                                                        |
RR:|                                                        |
    ---D7 ->D6 ->D5 -> D4 -> D3 -> D2 -> D1 -> D0 ->Carry---

В сдвигах типа RR и RL флаг переноса включен последовательно  в
общую цепочку битов.
Существуют команды RLA и RRA, отличительные особенности которых
имеют ту же природу, что и для RLCA и RRCA. С флагами  дела  об-
стоят так же.

   Следующие виды сдвигов в процессоре 8080 не были реализованы
и появились только в Z80. Поэтому для них не существует привиле-
гированной формы по отношению к аккумулятору.Все описанные ниже
команды допускают любую адресацию и влияют на все флаги.
Флаг P/V отражает четность.

Сдвиг влево типа SLA:

      Carry<--- D7<- D6<- D5<- D4<- D3<- D2<- D1<- D0<--- 0

SLA сдвигает байт влево; бит 7 выдвигается в признак переноса;
в бит 0 вдвигается 0.

Сдвиг вправо типа SRA (читается "Эс-Эр-Эй"):
      ->-
     |   |
     |   |
      -<-D7 --->D6 ->D5 ->D4 ->D3 ->D2 ->D1 ->D0 --->Carry

SRA сдвигает байт вправо; бит 7 копируется сам на себя  и  одно-
временно выдвигается в соседний бит 6, то есть как бы размножае-
тся; 0-й бит выдвигается в признак переноса.
SRA не является зеркальным отображением SLA.

А сдвиг типа SRL  как раз им является:

        0 --->D7 ->D6 ->D5 ->D4 ->D3 ->D2 ->D1 ->D0 --->Carry.

На этом группа команд побитного сдвига исчерпывается.

	      Двоично-десятичные сдвиги RLD и RRD.

RLD:                       --------------->------------------
                          |                                  |
                          |                                  |
A: D7 D6 D5 D4    D3 D2 D1 D0   (HL):  D7 D6 D5 D4   D3 D2 D1 D0
   ___________    ___________          ___________   ___________
     не изм.          |                   |     |         |
                      |                   |     |         |
                       ----------<--------       ----<----


RRD:                        ------>-------       ---->--
                           |              |     |       |
                           |              |     |       |
A:  D7 D6 D5 D4    D3 D2 D1 D0   (HL):  D7 D6 D5 D4  D3 D2 D1 D0
    ___________    ___________          ___________  ___________
      не изм.        |                                       |
                      ------------------<--------------------


Эти замысловатые сдвиги скорее напоминают пересылки четырехбито-
ых групп между аккумулятором и памятью.
В RLD движутся по кругу: младшая половина ячейки, адресуемой по
(HL),- в старшую половину; прежние 4 бита из старшей половины -
в младшие 4 бита аккумулятора; прежние младшие  4 бита аккумуля-
тора - в младшую половину (HL).
В RRD движение 4-битовых групп в (HL) идет вправо - старшая  по-
ловина перемещается на место младшей, младшая  половина  перехо-
дит в аккумулятор, а младшая половина аккумулятора занимает мес-
то старшей половины (HL).
RLD и RRD влияют на флаги Z, P/V, S, отталкиваясь  от содержимо-
го аккумулятора.
Флаг P/V отражает четность. Флаг C не изменяется.

Операция сдвига USPH (User's Shift by Phase) - сдвиг  по фазе у
пользователя.
Возникает к концу дня после неудачной попытки с ходу понять,что
такое RLD.
Но шутки шутками, а:
что касается использования столь причудливых команд,  как RLD и
RRD, то, помимо сомнительной двоично-десятичной арифметики  (не
знаю, не пробовал и не собираюсь пробовать), они  эффективны  в
задаче печатания  64-символьных строк  на 32-символьном  экране
компьютера"Спектрум". Больше мне их никуда приткнуть не удалось.

[ Продолжение следует ].




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

Похожие статьи:
BBS - список станций BBS ZXNet.
Demo-строение - Реализация плазмы pазмеpом 2x2.
Открытие - Мифы и реальность компьютера PC. Компьютер - наша надежда, наше спасение, волшебник, герой ...

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