Optron
#30
03 сентября 1999 |
|
Ликбез - Ассемблер взгляд издалека: Что такое сдвиг?
Ассемблер - взгляд издалека Продолжение. Начало в || 20, 21, 24, 25, 28, 29 {}Инфарх, 1999 Команды сдвига Что такое сдвиг? Смысл сдвига в том, что все биты в бай- те, не меняя своего положения относительно друг друга, смещаются вправо или влево. А в завсимости от типа команды биты, "уходя- щие за край" байта, могут появиться с про- тивоположной стороны (циклические сдвиги) или затеряться в первозданном хаосе (сдви- ги простые или нециклические). Пример. Применим к числу %01100010 циклический сдвиг вправо. Результатом будет число %00110001 А используя простой сдвиг влево, получим %1100010? Знак "?" означает, что бит принял состо- яние, нам заранее неизвестное, и зависящее от типа команды, состояния флагов и т.д. Команды сдвига аккумулятора Существуют четыре команды смещения битов в аккумуляторе: RLCA RLA RRCA RRA Вторая буква здесь красноречиво свиде- тельствует о направлении сдвига. Команды "RLCA" и "RLA" сдвигают содержимое "А" влево, "RRCA" и "RRA" - вправо. А если в мнемонике команды есть буква "C", то это указывает на участие в операции флага пе- реноса CY. Для пущей наглядности проиллюстрируем исполнение таких команд. ┌──┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ │CY│<─┬┤7│6│5│4│3│2│1│0│<─┐ └──┘ │└─┴─┴─┴─┴─┴─┴─┴─┘ │ └───────────────────┘ Как видно из привeдённой схемы, при вы- полнении "RLCA" происходит циклический сдвиг битов аккумулятора влево. Бит, зани- мавший крайнее левое положение (D7), пере- ходит на место крайне правого (D0) и ко- пируется в флаг переноса "CY", а прочие биты просто смещаются влево. Это можно с успехом применять для проверки содержимого крайнего бита: LD A,%10011010 RLCA JR C,MET ... MET Приведённый фрагмент программы вполне пригоден к эксплуатации. Естественно, за- грузка "A" будет не такой явной, иначе ка- кой смысл в проверке? Но суть в том, что если в старшем бите аккумулятора будет "1", то процессор совершит переход на мет- ку "MET", тем самым отказав в исполнении фрагменту програмы, обозначенному в нашем примере многоточием. А теперь - команда "RLA": ┌──┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌─┤CY│<──┤7│6│5│4│3│2│1│0│<─┐ │ └──┘ └─┴─┴─┴─┴─┴─┴─┴─┘ │ └───────────────────────────┘ Перед вами циклический свиг аккумулятора вправо. В отличие от "RLCA" здесь флаг пе- реноса тоже принимает участие в работе, предоставляя своё содержимое в качестве ещё одного бита для сдвига. Пример. Если в "А" находится число %01101010, и флаг переноса установлен, то после ис- полнения "RLA" в "А" будет находится число %11010101, и флаг "CY" окажется сброшенным. А вот сдвиги в противоположную сторону: ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌──┐ ┌─>│7│6│5│4│3│2│1│0├─┬>│CY│ │ └─┴─┴─┴─┴─┴─┴─┴─┘ │ └──┘ └────────────────────┘ ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌──┐ ┌─>│7│6│5│4│3│2│1│0├──>│CY├─┐ │ └─┴─┴─┴─┴─┴─┴─┴─┘ └──┘ │ └───────────────────────────┘ Как видите, команды "RRCA" и "RRA" пол- ностью идентичны рассмотренным ранее, за исключением направления сдвига. Команды сдвига регистров общего назначения Выше мы рассмотрели действия с аккумуля- тором. Но и все прочие регистры также "не остались обездоленными" в этом плане. Даже наоборот, команд для них ещё больше. Есть, например, группа команд: RLC s RL s RRC s RR s В них "s" обозначает "(HL)", "(IX+d)", "(IY+d)" или один из регистров: "A", "B", "C", "D", "E", "H", "L" Во всём остальном эти комады аналогичны тем, что относятся к "A": "RLC s", "RL s" выполняют сдвиг "s" влево, "RRC s", "RR s" - вправо. Флаг переноса участвует в опера- ции аналогичным образом. Рассмотрим теперь "SLA s" и "SRL s": ┌──┐ ┌─┬─┬─┬─┬─┬─┬─┬─┐ │CY│<──┤7│6│5│4│3│2│1│0│<──0 └──┘ └─┴─┴─┴─┴─┴─┴─┴─┘ ┌─┬─┬─┬─┬─┬─┬─┬─┐ ┌──┐ 0──>│7│6│5│4│3│2│1│0├──>│CY│ └─┴─┴─┴─┴─┴─┴─┴─┘ └──┘ Эти команды весьма широко распростране- ны, т.к. помимо сдвига влево или вправо они заполняют освобождающееся место нуле- вым значеием, следовательно, могут рассматриваться как умножение и деление на два соответственно. И, наконец, команда "SRA s": ┌────┐ │ ┌┴┬─┬─┬─┬─┬─┬─┬─┐ ┌──┐ └──>│7│6│5│4│3│2│1│0├──>│CY│ └─┴─┴─┴─┴─┴─┴─┴─┘ └──┘ Её можно рассматривать как операцию "де- ление на два со знаком". В сдвиге принима- ют участие только 7 младших бит, а старший остаётся без изменения. Но не подумайте, что это всё! Существует ещё... Сдвиг полубайтов Он выполняется по "RLD" и "RRD". Эти ко- манды используются не так уж и часто. Быть может, вам вообще не придётся обращаться к ним. Но, тем не менее, рассмотреть их всё же надо. Итак, схема: ┌───────────────┐ ┌─────╥──┴──┐ ┌─────╥──v──┐ │7...4║3...0│ │7...4║3...0│ └─────╨──^──┘ └─┬─^─╨──┬──┘ A └────────┘ └────┘ (HL) ┌───────────────┐ ┌─────╥──v──┐ ┌─────╥──┴──┐ │7...4║3...0│ │7...4║3...0│ └─────╨──┬──┘ └─^─┬─╨──^──┘ A └────────┘ └────┘ (HL) Как видите, в работе принимают участие одновременно как "A", так и "(HL)". Обмен между ними происходит группами по 4 бита, причём старшие 4 бита аккумулятора остают- ся без измнений. Пример. Если в аккумуляторе содержится байт %11010010, а по адресу "HL" хранится байт %01111001, то после исполнения команды "RLD" в акку- муляторе окажется число %11010111, а "HL" будет адресовать байт %10010010 Команда "RRD" выполняется аналогично, за исключением, конечно, направления сдвига, как и видно на схеме. Ну и, конечно, рассмотрим такую важную часть любой команды ассемблера, как... Влияние команд сдвига на флаги ╔═══════════╤═══════════════╗ ║ Мнемоника │ Флаги ║ ║ операции ├───────────────╢ ║ │ C Z P/V S N H ║ ╟───────────┼───────────────╢ ║ RL s │ x x P x 0 0 ║ ║ RR s │ x x P x 0 0 ║ ║ RLC s │ x x P x 0 0 ║ ║ RRC s │ x x P x 0 0 ║ ║ RLA │ x . . . 0 0 ║ ║ RRA │ x . . . 0 0 ║ ║ RLCA │ x . . . 0 0 ║ ║ RRCA │ x . . . 0 0 ║ ║ RLD │ . x P x 0 0 ║ ║ RRD │ . x P x 0 0 ║ ╚═══════════╧═══════════════╝ Вот и всё влияние! Все обозначения в таблице должны быть вам знакомы из прошлых занятий. Единствен- ный новый знак - "s", но о нём было сказа- но выше. Продолжение следует...
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября