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 |


