|
Ушел с форума
16379 / 7691 / 1080
Регистрация: 11.11.2010
Сообщений: 13,773
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 15.11.2013, 04:43 [ТС] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ГЛАВА 12 Синтаксис команды:КОМАНДЫ СДВИГА (часть 2/3) Циклические сдвиги Команда ROL (Циклический сдвиг операнда влево = Rotate Operand Left) Рис. 12.3.1. Схема работы команды ROL ROL <DEST>,<COUNT> Семантика команды: операция циклического сдвига операнда DEST влево.Алгоритм работы:
rol mem/reg(8/16/32/64),count(cl/imm) Применение:команда ROL используется для циклического сдвига разрядов операнда влево. Отличие этого сдвига от RCL в том, что очередной сдвигаемый бит одновременно вдвигается в операнд справа и становится значением флага CF. Так же, как и для других сдвигов, значение второго операнда (счетчика сдвига) ограничено диапазоном 0...63. Это объясняется тем, что микропроцессор использует только шесть младших разрядов операнда COUNT. Аналогично другим командам сдвига сохраняется эффект, связанный с поведением флага OF, значение которого имеет смысл только в операциях сдвига на один разряд:
Команда ROR Синтаксис команды:(Циклический сдвиг операнда вправо= Rotate Operand Right) Рис. 12.3.2. Схема работы команды ROR ROR <DEST>,<COUNT> Семантика команды: операция циклического сдвига операнда вправо.Алгоритм работы:
ror mem/reg(8/16/32/64),count(cl/imm) Применение: команда ROR используется для циклического сдвига разрядов операнда вправо. Отличие этого сдвига от RCR в том, что очередной сдвигаемый бит одновременно вдвигается в операнд слева и становится значением флага CF. Так же, как и для других сдвигов, значение операнда COUNT (счетчика сдвига) ограничено диапазоном 0...63. Это объясняется тем, что микропроцессор использует только шесть младших разрядов операнда COUNT. Аналогично другим командам сдвига сохраняется эффект, связанный с поведением флага OF, значение которого имеет смысл только в операциях сдвига на один разряд:
Команда RCL Синтаксис команды:(Циклический сдвиг операнда влево через флаг переноса = “Rotate operand through Carry flag Left”) RCL <DEST>,<COUNT> Семантика команды: операция циклического сдвига операнда влево через флаг переноса CF.Рис. 12.3.3. Схема работы команды RCL rcl mem/reg(8/16/32/64),count(cl/imm) Алгоритм работы:
Применение: команда RCL используется для циклического сдвига разрядов операнда влево. Особенность этого сдвига в том, что он происходит с некоторой задержкой, так как очередной сдвигаемый бит оказывается на некоторое время вне операнда. В это время можно произвести его извлечение и (или) подмену. Другой важный момент заключается в том, что для счетчика сдвига микропроцессор использует только шесть младших разрядов операнда COUNT. Таким образом, значение, большее 64, микропроцессором не допускается (аппаратно это ограничение реализуется тем, что игнорируются значения всех битов счетчика, кроме первых шести). Обратите внимание на еще один интересный эффект, связанный с поведением флага OF. В операциях сдвига на один разряд по изменению этого флага можно судить о факте изменения знакового (старшего) разряда операнда:
Команда RCR Синтаксис команды:(Циклический сдвиг операнда вправо через флаг переноса = “Rotate operand through Carry flag Right”) RCR <DEST>,<COUNT> Семантика команды: операция циклического сдвига операнда вправо через флаг переноса CF.Рис. 12.3.4. Схема работы команды RCR rcr mem/reg(8/16/32/64),count(cl/imm) Алгоритм работы:
Применение: команда RCR используется для циклического сдвига разрядов операнда влево. Особенность этого сдвига в том, что он происходит с некоторой задержкой, так как очередной сдвигаемый бит оказывается на некоторое время вне операнда. В это время можно произвести его извлечение и (или) подмену. Другой важный момент заключается в том, что для счетчика сдвига микропроцессор использует только шесть младших разрядов операнда COUNT. Таким образом, значение, большее 63, микропроцессором не допускается (аппаратно это ограничение реализуется тем, что игнорируются значения всех битов счетчика, кроме первых шести). Обратите внимание на еще один интересный эффект, связанный с поведением флага OF. В операциях сдвига на один разряд по изменению этого флага можно судить о факте изменения знакового (старшего) разряда операнда:
Записи Запись – это упакованная структура, размер полей которой занимают не отдельные байты, а от одного до нескольких битов. Запись в языке ассемблер может иметь размер только кратный байту (байт, слово, двойное слово). Содержимое записи рассматривается как состоящее из нескольких частей, называемых полями записи. Каждое поле – это группа соседних битов. Поля должны быть прижатыми друг к другу, между ними не допускаются промежутки, не относящиеся к полям. Размер поля (число битов в нем) любой, но в сумме их размеры не должны превышать 8, 16, 32 и т.д. Сумма размеров всех полей записи называется размером записи. Если размер записи меньше или равен 8, то под запись компилятор отведет байт в памяти, при размере от 9 до 16 – отводится слово и так далее. Если поля занимают не всю ячейку, то они прижимаются к правому краю ячейки (к старшим битам), а левые (младшие) биты ячейки считаются не относящимися к записи. Поля получают имена, но обращаться к полю записи по имени нельзя.Описание типа записи Прежде чем использовать в программе записи, необходимо описать их тип с помощью директивы вида:<имя типа записи> RECORD <поле> {, <поле>}
Описание типа записи носит информационный характер, по нему ассемблер ничего не заносит в машинные коды программы, поэтому его можно размещать в любом месте программы, но обязательно до описания переменных этого типа. Описание переменных-записей Переменные-записи называются просто записями. Для описания такой переменной в программу надо поместить директиву видаимя_переменной имя_типа <нач_знач {, нач_знач}> где нач_знач – это константное выражение, «?» или «пусто» (здесь уголки – не метасимволы, а явно указываемые символы).Примеры:
Допускается и следующее сокращение при задании начальных значений полей: если в качестве последних нач_знач указывается «пусто», то последние подряд идущие запятые можно опустить. Например:
Как и в случае структур, одной директивой можно описать массив записей, для чего в правой части директивы указывается несколько операндов и/или конструкция повторения DUP. Например, по директиве
Средства для работы с полями записей Как видно, пока всё очень похоже на структуры. Однако дальше идут отличия. Дело в том, что на поля записи нельзя уже ссылаться с помощью конструкции вида <имя_записи>.<имя_поля> например, VIC.Y – ошибка. Это связано с тем, что такая конструкция должна обозначать не ячейку, а только часть ячейки, но части ячеек не адресуются. Поэтому такая конструкция не допускается в языке ассемблер. При работе с записями как едиными объектами проблем не возникает, так как запись в целом это байт, слово или двойное слово. Например, присвоение значений одной записи R1 другой записи R2 реализуется командами
WIDTH <имя_поля_записи> WIDTH <имя_записи_или_её_типа> Если указано имя поля, то значением оператора является размер указанного поля в битах, а если указано имя записи или имя типа записи, тогда оператор выдает размер всей записи (сумму размеров всех ее полей). Например: WIDTH Y = 7 WIDTH REC = 6 12.4.4. Оператор MASK MASK <имя_поля_записи> MASK <имя_записи_или_её_типа> Значением оператора является маска (байт, слово или двойное слово – в зависимости от размера записи), содержащая 1 в тех разрядах, которые принадлежат указанному полю или всем полям записи, и нули в остальных разрядах. Например:
Значение имени поля Имени любого поля записи компилятор приписывает некоторое значение. Им является число, на которое надо сдвинуть это поле вправо, чтобы оно оказалось прижатым к правому краю ячейки. Например, значением имени D (из записи типа DATE) является число 0, имени M – число 5, имени Y – число 9.Встречая имя поля записи в тексте программы, ассемблер заменяет его на это значение. Обычно это нужно в командах сдвига, в которых сдвигаем поля записей. Например, проверить, равно ли 5 поле M в записи VIC:
Дополнительные возможности обработки записей Для работы с записями добавлено две директивы SETFIELD и GETFIELD со следующим синтаксисом:SETFIELD имя_поля_записи приемник, регистр_источник GETFIELD имя_поля_записи регистр_приемник, источник Работа директивы SETFIELD заключается в следующем. Местоположение записи определяется операндом приемник, который может представлять собой регистр или ячейку памяти. Операнд имя_поля_записи определяет элемент записи, с которым ведется работа (смещение элемента в записи относительно младшего разряда). Новое значение, в которое необходимо установить указанный элемент записи, должно содержаться в операнде регистр_источник. Обрабатывая данную директиву, транслятор генерирует последовательность команд, которые сдвигают содержимое операнда регистр_источник влево на количество разрядов, соответствующее расположению элемента в записи, выполняют операцию OR над операндами приемник и регистр_источник, результат помещается в операнд приемник. Действие директивы GETFIELD обратно действию SETFIELD. В качестве операнда источник может быть указан регистр или ячейка памяти. В регистр, указанный операндом регистр_приемник, помещается результат работы – значение элемента записи.
0
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Новые блоги и статьи
|
|||
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|