000E' EB EX DE, HL

000F' C9 RET

END

└───────────────────────────────

Обратите внимание на то, что записи '0' и '9' означают коды

знаков "0" и "9". Попробуйте разобраться, как работает программа,

и подумайте над вопросом - будет ли она работать с отрицательными

числами или с числами, большими чем 99.

9. Команды сдвига

Команды сдвига позволяют сдвинуть биты одного регистра или

байта памяти влево или вправо на один бит.

Имеются следующие типы команд:

- арифметический сдвиг влево (SLA - Shift Left Arithmetical);

- арифметический и логический сдвиг вправо (SRA - Shift Right

Aritmetical, SRL - Shift Right Logical);

- циклический сдвиг (RLCA, RLC, RRCA, RRC);

- циклический сдвиг через флаг C (RLA, RRA);

- перестановка полубайт (RLD, RRD).

В командах SLA и SRL освободившийся разряд заполняется нулевым

битом. В команде SRA тиражируется знаковый бит.

Схема работы команды SLA:

┌──┐ ┌──┬──┬──┬──┬──┬──┬──┬──┐

│ ◄─────│b7│b6│b5│b4│b3│b2│b1│b0◄──── 0

└──┘ └──┴──┴──┴──┴──┴──┴──┴──┘

НЕ нашли? Не то? Что вы ищете?

флаг C регистр/память

Схема работы команды SRA:

┌──────────────────────────────────────┐

│ ┌──┐ ┌──┬──┬──┬──┬──┬──┬──┬──┐ │

└──► │ ┌─►b7│b6│b5│b4│b3│b2│b1│b0├──┘

└──┘ │ └┬─┴──┴──┴──┴──┴──┴──┴──┘

└──┘

флаг C регистр/память

Схема работы команды SRL:

┌──────────────────────────────────────┐

│ ┌──┐ ┌──┬──┬──┬──┬──┬──┬──┬──┐ │

└──► │ ┌─►b7│b6│b5│b4│b3│b2│b1│b0├►─┘

└──┘ │ └──┴──┴──┴──┴──┴──┴──┴──┘

0

флаг C регистр/память

Например, если в регистре B было двоичное значение 00111011, то

после выполнения команды SLA B в регистре B появится значение

01110110.

Арифметический сдвиг влево SLA можно использовать для умножения

на степень двойки, а арифметический сдвиг вправо SRA - для деления

на два без остатка ( нацело).

Приведем листинг программы, делящей содержимое регистра А

нацело на 8. Она должна вызываться из программы на языке MSX-BASIC

с помощью функции USR.

┌──────────────────────────

'divide on 8' Z80-Assembler Page: 1

TITLE 'divide on 8'

ORG 9000h

521F = getA EQU 521Fh

2F99 = outHL EQU 2F99h

; === вход из USR

9000 CD1F52 CALL getA ; записать аргумент в А

; === деление на 8 нацело

9003 CB2F SRA A ; делим на 2

9005 CB2F SRA A ; еще раз

9007 CB2F SRA A ; и еще

; === возврат

9009 2600 LD H,0 ;

900B 6F LD L, A ;

900C C3992F JP outHL ; возвращаем результат

END

└──────────────────────────

Команды циклического сдвига сдвигают содержимое регистра или

байта памяти влево или вправо на один бит. При этом выдвинувшийся

за разрядную сетку бит не теряется, а переносится на первое место

с другого конца байта.

Схема работы команды RLCA:

┌─────────────────────────────┐

┌──┐ │ ┌──┬──┬──┬──┬──┬──┬──┬──┐ │

│ ◄───┴─┤b7│b6│b5│b4│b3│b2│b1│b0◄───┘

└──┘ └──┴──┴──┴──┴──┴──┴──┴──┘

флаг C аккумулятор

Команда RLC выполняется аналогично над регистром или косвенно

адресуемой памятью. Если в аккумуляторе было записано число

10110100, то после выполнения команды RLCA в нем появится значение

01101001.

Схема работы команды RRCA:

┌───────┬──────────────────────────────┐

│ ┌──┐ │ ┌──┬──┬──┬──┬──┬──┬──┬──┐ │

└─► │ └──►b7│b6│b5│b4│b3│b2│b1│b0│───┘

└──┘ └──┴──┴──┴──┴──┴──┴──┴──┘

флаг C аккумулятор

Команда RRC выполняется аналогично над регистром или памятью.

Кроме этого можно использовать команды циклического сдвига

влево или вправо через флаг C.

Схема работы команды RLA:

┌──────────────────────────────────────┐

│ ┌──┐ ┌──┬──┬──┬──┬──┬──┬──┬──┐ │

└─┤ ├──◄──┤b7│b6│b5│b4│b3│b2│b1│b0├◄──┘

└──┘ └──┴──┴──┴──┴──┴──┴──┴──┘

флаг C аккумулятор

Команда RL выполняется аналогично над регистром или памятью.

Схема работы команды RRA:

┌──────────────────────────────────────┐

│ ┌──┐ ┌──┬──┬──┬──┬──┬──┬──┬──┐ │

└─► ├──►──┤b7│b6│b5│b4│b3│b2│b1│b0├───┘

└──┘ └──┴──┴──┴──┴──┴──┴──┴──┘

флаг C аккумулятор

Команда RR выполняется аналогично над регистром или памятью.

Ниже приводится листинг прoграммы преобразования однобайтного

числа в двоично-десятичном коде (BCD) в однобайтное двоичное

число. Аргумент программа берет в ячейке A000h, а результат

записывает в A0001h. Примеры выполняемых преобразований:

двоично-десятичный код двоичный код

10 = 0001 0000 => 0A = 0000 1010

47 = 0100 0111 => 2F = 0010 1111

87 = 1000 0111 => 57 = 0101 0111

┌───────────────────────────

'conversion' Z80-Assembler Page: 1

TITLE 'conversion'

; === преобразование BCD-числа в двоичное число

A000 = bcdarg EQU 0A000h

A001 = hexres EQU 0A001h

ORG 9000h

; === берем аргумент

9000 3A00A0 LD A,(bcdarg); записать однобайтный

; параметр в A

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46