С
машиной
на
«ты»
Nick 'nVr'
Продолжаем знакомиться с основами языка низкого уровня Ассемблер. Начало цикла статей
в
МК, №39(314) и №43(318). В этой части мы с вами завершим обзор системы команд МП 80286.
Н
ачнем с
арифметических и логических команд.
Здесь я не
буду приводить их полный перечень — для этого есть спра-
вочная литература Мы ознакомимся лишь с основными ви-
дами, реально необходимыми для написания программ.
a d d
— сложение. Эта команда, равно как и команда
s u b
(вычитание), во многом похожа на команду
m o v . Э
т о и
неуди-
вительно — ведь выполняются они все на
АЛУ,
арифметико-
логическом устройстве процессора, и схема выборки операн-
дов для них используется одна и та же. Команды принимают
те же типы операндов, что и
m o v .
Результат сохраняется в пер-
вом операнде.
m u l (i m u l )
— умножение. Здесь все сложнее. Самая распро-
страненная форма команды — с одним операндом, при этом
считается, что второй уже записан в регистр
а х или
a l
(зави-
сит от размерности второго операнда). Результаты работы ко-
манды сохраняются либо в регистре
а х
(при 8-битных операн-
дах), либо в паре регистров
D X : а х , причем в d x находится стар-
шее слово. Команда
i m u l
отличается от
m u l
тем, что старшие
биты операндов считает знаковыми. Естественно, операнд мо-
жет быть любым.
D iv
(i d i v ) — деление. Синтаксис и принцип действия похожи
на
m u l ,
но, во-первых, операнд в ней является делителем, а де-
лимое
Д О Л Ж Н О помещаться либо В А Х , либо В D X : A X . Если дели-
тель 8-битный, частное идет в
a l ,
а остаток — в
А Н , в противном
же случае частное помещается в
а х , а остаток — в d x .
С м р — сравнение. Очень похоже на вычитание, но само вы-
читание при этом не производится.
C m p x c h g — интересная команда, осуществляющая сравнение
и обмен между операндами. Если операнды равны, то приемник
пересылается в источник, если не равны — наоборот. Таким об-
разом, ее корректнее было бы назвать
c m p m o v ,
но тут уж ниче-
го не поделаешь.
a n d
— логическое «и». Напомню, что «и» — это битовая опе-
рация, возвращающая 1 лишь в том случае, когда оба операн-
да (в самом общем случае —
N
из
N,
но это к нам не относит-
ся) равны 1. Эта команда выполняет операцию побитово над
всеми разрядами операндов.
o r
— логическое «или». Возвращает
1 тогда, когда хотя б ы
один из операндов ненулевой.
x o r
— исключающее «или». Операция
x o r ,
называемая еще
сложением по модулю 2, возвращает 1 только тогда, когда не-
четное и ненулевое количество операндов равно 1.
N O T — «не». Выполняет инверсию операнда, заменяя едини-
цы на нули и наоборот.
T E S T — к о м а н д а в ы п о л н я е т в с е т о ж е , Ч ТО И A N D , н о н е и з м е -
н я е т п р и е м н и к , а л и ш ь у с т а н а в л и в а е т ф л а г и .
Следует заметить, что логические команды действуют быст-
рее, чем арифметические. Проиллюстрируем.
С арифметической командой:
С М Р А Х , о
j e s o m e _ l a b e l
И с логической:
T E S T А Х , O F F F F h
j z s o m e _ l a b e l ; н е с л е д у е т з а б ы в а т ь , ч т о к о м а н д ы j е и j z
э к в и в а л е н т н ы
Таким образом вы (в общем случае) выиграете пару тактов
процессора. На первый взгляд, немного, но если вдруг встретит-
ся цикл на миллионы раз? Откуда, вы думаете, происходят тор-
моза в работе современного программного парка — да отсю-
да же! Из таких вот мелочей. Из нежелания фирм — производи-
телей компиляторов (да и разработчиков API, причем это каса-
ется не только Windows) делать КАЧЕСТВЕННУЮ оптимизацию
кода. Сейчас, сидя за машиной, я вспоминаю программу
MARS,
которую впервые увидел в 95-м году на 486SX-40. Все бы ниче-
го, но качество [рафики, на мой взгляд, там не уступало.
.. ска-
жем так, играм трех-четырехлетней давности. С прискорбием вы-
нужден заметить, что PASCAL-подобные средства разработки
производства Borland (мои любимые, между прочим) в полной
мере обладают подобными недостатками. Ну да ладно. Покон-
чим с лирикой, вернемся к нашим командам.
i n c
— инкремент, повышение операнда на 1
Одна из самых
быстродействующих команд. Обратная к ней команда —
d e c
(декремент). Это тоже довольно мощный источник для оптимиза-
ции, так как эти команды процессор выполняет за 1
такт.
Еще очень интересные (и часто забываемые) команды — это
команды серии в т (bit test). В них первый операнд выступает в ро-
ли источника, о второй — индекса. Бит из источника с заданным
индексом записывается в CF. Команда втс записывает в CF ин-
версное значение бита,
b t r
записывает бит в
c f ,
а в источнике
устанавливает его в о,
b t s
же устанавливает его в 1.
s h l / s h r
(SHift) — обычный сдвиг операнда влево/вправо на
заданное вторым операндом число разрядов. Эти команды мо-
гут рассматриваться как самый быстрый вариант умножения/це-
лочисленного деления на 2 в степени (индекс). Последний из «вы-
толкнутых» битов записывается в
c f .
Команда
s a l
(Shift Arith.)
аналогична
s h l ,
а вот
s a r
принимает старший бит за знаковый
разряд. При этом «вдвигаемый» в операнд бит равен знаковому
разряду, а знаковый разряд не меняется. Пример работы:
M O V А Х , 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 b ; 0 F 0 F h
S H L А Х , 4 ; A X = 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 b = F 0 F 0 h = 0 F 0 F h * 1 6
r o l / r o r
(Rotate Operand) — циклический сдвиг, т.е. вытолкну-
тый бит заталкивается в операнд с другой стороны. При этом он
записывается в
c f .
r c l / r c r
(Rotate with Carry) — циклический сдвиг с переносом.
Вытолкнутый бит записывается в
c f ,
а предыдущее значение
c f
записывается в операнд с другой стороны.
Теперь рассмотрим самые интересные и подчас опасные ко-
манды
управления микропроцессором.
Во-первых,
команды для работы с флагами.
c l c / s t c
— очистка/установка
c a r r y f l a g .
Вообще, соглас-
но неписаному правилу разработчиков-ассемблерщиков, сооб-
щение об ошибочном выполнении подпрограммы возвращается
во флаге
C F , чтобы затем организовать быструю обработку. Возь-
мите это себе на заметку.
c l d / s t d
— очистка/установка
d i r e c t i o n
f l a g .
Применяется
в цепочечных командах, о чем — далее.
C L i / s t i — очистка/установка I N T E R R U P T I O N f l a g . Необхо-
димость в использовании данных команд может возникнуть, ко-
гда вы не хотите, чтобы вашу точно высчитанную по времени
подпрограмму что-либо прервало, растянув выполнение.
смс
(Complement) — инверсия
c a r r y f l a g .
Не знаю, зачем.
..
но может пригодиться.
Остальные биты регистра флагов вам придется устанавливать
вручную. Впрочем, инструментарий для этого есть.
h l t
— останов М П. Эта команда не только позволяет намерт-
во завесить машину, но и заставит ее среагировать на аппарат-
ное прерывание точно вовремя — если, конечно, вы не сделали
перед
Э ТИМ C L I © .
n o p
— нет операции. Иногда, когда нужно подождать несколь-
ко тактов, эта команда очень полезна.
l o c k
— префикс, заставляющий М П сгенерировать сигнал за-
хвата шины (чтобы правильно выполнить некоторые команды). В
основном это касается многопроцессорных систем, которые то-
гда было куда проще реализовывать. Впрочем, не стоит забы-
№ 45/320 08 ноября-15 ноября 2004
предыдущая страница 40 Мой Компьютер 2004 45 читать онлайн следующая страница 42 Мой Компьютер 2004 45 читать онлайн Домой Выключить/включить текст