Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Топ:
Выпускная квалификационная работа: Основная часть ВКР, как правило, состоит из двух-трех глав, каждая из которых, в свою очередь...
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Техника безопасности при работе на пароконвектомате: К обслуживанию пароконвектомата допускаются лица, прошедшие технический минимум по эксплуатации оборудования...
Интересное:
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Мероприятия для защиты от морозного пучения грунтов: Инженерная защита от морозного (криогенного) пучения грунтов необходима для легких малоэтажных зданий и других сооружений...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Дисциплины:
2022-10-04 | 34 |
5.00
из
|
Заказать работу |
|
|
Команды делятся на 2 группы:
а) Логические команды.
Общие черты:
1) выполняют побитовую обработку операндов параллельно без переносов
1-истина
0-ложь;
2) модифицируют флаги, но важен только флаг ZF;
3) операндамимогут быть байты или слова в регистрах или ячейках памяти, второй операнд может быть непосредственным.
NOTop; отрицание op(инверсия кода); Флаги не модифицирует.
ANDop1, op2; op1:=op1^ op2
OR op1, op2; op1:= op1v op2
XORop1, op2; op1:= op1Åop2
TESTop1,op2; op1^ op2 – результат не запоминается. Эта операция называется «логическое сравнение». Цель формирование флага ZF, который ZF = 1 - если результат нулевой, иначе ZF = 0.
Как правило, второй операнд трактуется как маска, хранящая единицы в разрядах op1, которые нас интересуют.
б) Команды сдвигов
Все команды сдвигов имеют 2 операнда:
оp1 – рассматривается, как набор битов, подлежащих сдвигу влево или вправо;
op2 – константа сдвига, т.е. целоечисло без знака, определяет, на сколько разрядов нужно сдвигать первый операнд.
Результат записывается на место первого операнда.
Каждая команда может иметь 2 разновидности:
МНК op, 1; сдвиг на 1 разряд
МНК op, CL; константа сдвига хранится в CL
Само значение CLне изменяется.
Команды сдвига модифицируют флаги, кроме AF, а “уходящий” бит фиксируется в CF.
Команды сдвига делятся на арифметические, логические и циклические.
А) Логическийсдвиг – можно трактовать как умножение беззнаковых чисел на 2CL.
|
|
SHLop, CL;сдвиг влево 0
SHRop,1;сдвиг вправо
|
|
|
Б)Арифметический сдвиг – предназначендля быстрого умножениячисел со знаком на 2CL
SALop,1; сдвигарифм. влево
SALop,CL; сдвигарифм. влево 0
|
|
SARop,1;сдвигарифм.вправо 0
|
|
ROLop,1;сдвиг циклич. влево
ROLop,CL;сдвиг циклич. влево
RORop,1;сдвигциклич. вправо
RORop,CL; сдвигциклич. вправо
|
|
RCL ор,CL; сдвиг циклич. через переносвлево
RCRop,1;сдвиг циклич. через перенос вправо
RCRop,CL;сдвиг циклич. через перенос вправо
Циклические сдвиги позволяют образовать передачу числа с последовательным кодом и анализировать разряды числа.
В МП 80286 и позже допускается использование второго операнда без загрузки в CL (непосредственный).
Например,
SHLAX,3
Команды передачи управления (2ч)
Метки, данные, переходы
Условные и безусловные переходы являются важнейшей частью любой программы; они позволяют писать программы с ветвящимися и циклическими алгоритмами.
Данные в программах на ассемблере объявляются (или резервируются) с помощью директив данных. В табл. приведены директивы для объявления данных (переменных).
За директивой описания данных должно следовать одно или несколько числовых значений, разделенных запятыми. Эти выражения определяют значения для простейших элементов данных, размер которых зависит от того, какая директива используется. Вместо числового значения может стоять символ; впоследствии он будет интерпретирован как числовой код символа (символов).
Пример использования директив объявления данных
db 67h
db 5dh, 0f6h
db "z" ; то же самое, что и db 7ah
db "w", "k", "y"
dw 8a34h, 0c51h, 8bh
du 9e3ah, 07deh
dw "WE"; то же самое, что и db 57h, 45h
|
dd 01F243D5Eh
dd "WEGa"; то же самое, что и db 57h, 45h, 47h, 61h
dq 1122334455667788h
За директивами db и du могут следовать строки неопределённого размера; в результате каждый символ будет интерпретирован как его числовое значение. Отличие директивы du от db заключается в том, что каждый символ интерпретируется двумя байтами, старший из которых заполняется нулём, например:
db "assembler"
то же самое, что и
db 61h, 73h, 73h, 65h, 6Dh, 62h, 6Ch, 65h, 72h
du "assembler"
то же самое, что и
db 0, 61h, 0, 73h, 0, 73h, 0, 65h, 0, 6Dh, 0, 62h, 0, 6Ch, 0, 65h, 0, 72h
Для описания большей последовательности одинаковых данных предназначена директива dup. Она используется после директивы определения данных. Перед ней должно стоять число повторений, а после неё (в скобках) - значение или цепь значений для повторения.
db 7 dup (1Ah)
db 6 dup (45h, 0A3h, 90h)
dd 13 dup (0A713E445h)
dd 9 dup (0A713E445h, 0F8D3E412h)
dw 5 dup (?)
Если после директивы определения данных идёт вопросительный знак, то начальное значение этих данных будет не определено. Данные, помеченные вопросительным знаком, называются неинициализированными. Неинициализированные данные не включаются в исполняемый файл и будут доступны лишь после загрузки программы в память (разумеется, если это поддерживается форматом исполняемых файлов, в который будет компилироваться программа). Неинициализированные данные позволяют сократить размер исполняемого файла, т. к. в большинстве случаев не важно какое начальное значение имеет переменная.
Метки
Метка - идентификатор, который используется в программе и возвращает адрес памяти, по которому она находится. Метка - это главная форма взаимодействия с данными в памяти. Если метка используется в программе, то фактически на месте метки будет стоять адрес, на который она указывает.
Существуют разные способы определения меток. Простейший из них - двоеточие после названия метки. За этой директивой на той же строке может следовать инструкция или директива. Она определяет метку, значение которой равно смещению, т. е. адресу точки, в которой она определена. Вернее, смещению следующей директивы или инструкции. Этот метод обычно используется, чтобы пометить места в коде, но ничто не мешает вам пометить этим методом данные.
Данные обычно помечаются другим методом - это написание названия метки перед директивой объявления данных. Метка возвращает адрес данных, перед которыми она объявлена. Компилятор запоминает размер данных, на которые указывает эта метка, и при использовании с ней операндов, несовместимых по размеру, уведомляет об этом. При использовании этого метода объявления меток отпадает необходимость использования операторов размера (word, dword, qword и т. д.).
|
Третий метод объявления меток - самый гибкий: это использование директивы label. После этой директивы должно следовать имя метки, потом (опционально) размер оператора, далее (тоже опционально) оператор “at” и числовое выражение, определяющее адрес, на который данная метка должна ссылаться. В качестве адреса может использоваться другая метка, ведь метка это то же самое что и адрес, на который она указывает. Примеры объявления меток приведены в листинге.
Примеры объявления меток
metka1: dd...
data1 db...
dw...
mov...
add...
metka2:
and...
xor...
label metka3 dword at metka2
rcl...
В реальных программах выражение типа
moveax, dword[ 0 0 0 0 5 0 9 Ah ]
встретить почти невозможно, потому что разработчик программы не в силах рассчитать смещение каждой метки вручную. В большинстве программ для работы с данными в памяти используются метки. В листинге ниже приведены примеры их использования.
Примеры использования меток
metka1: dd...
data1 db...
dw...
…
mov al, [data1]
metka2:
mov ebx, eax
mov ebx, dword [metka1]
mov [data1], 4567AADDh
mov сx, word [metka2]
Последняя инструкция - это пример того, что в ассемблере нет разницы между кодом и данными. Назначение последней инструкции: в регистр сх помещается опкод инструкции movebx, еах, в регистре сх будет обычное число (код), с помощью которого кодируется инструкция movebx, еах.
Метка, имя которой начинается с точки, обрабатывается как локальная, и её имя прикрепляется к имени последней глобальной метки (с названием, начинающемся с чего угодно, кроме точки) для создания полного имени этой метки. Так, вы можете использовать короткое имя (начинающееся с точки) где угодно перед следующей глобальной меткой, а в других местах вам придется пользоваться полным именем. Метки, начинающиеся с двух точек, - исключения. Они имеют свойства глобальных, но не создают новый префикс для локальных меток.
|
Примеры использования локальных и глобальных меток
globmetka1:
.locmetka1 dd...
.Iocmetka2:
mov[.locmetka1], eax
movword[.Iocmetka2], сx
movword[.Iocmetka3], сх; ошибка!
mov word [globmetka2.Iocmetka2], сx
globmetka2:
.Iocmetka3:...
mov [..globmetka3.Iocmetka4], сx; ошибка!
mov [globmetka3.Iocmetka4], сx;ошибка!..
..globmetka3:
. Iocmetka4: dw...
mov [.Iocmetka4], сx
Метка $ обозначает текущее смещение или смещение текущей команды; таким образом, чтобы бесконечно зациклить выполнение программы, достаточно написать в программе jmp $, т. е. это будет ее безусловный «прыжок на саму себя».
Метки бывают ближние и дальние. Дальность или близость метки определяется только тем, в каком месте она используется. Одна и та же метка, используемая в двух разных командах, в одной команде может быть ближней, а в другой - дальней. Ближняя метка -та, которая определена не далее чем 127 байт после и не далее чем на 128 байт до команды, где она используется. Все метки, которые находятся за этими пределами, являются дальними. Дальность или близость меток имеет значение только с командами передачи управления.
Также при объявлении данных может быть необходимо объявлять разные структуры данных, в то же время находящиеся по одному адресу. Это может пригодиться, когда одни и те же данные в зависимости от контекста могут интерпретироваться по-разному, и удобнее было бы использовать разные названия переменных. В таких случаях применяется директива virtual. Далее в листинге приведён пример её использования.
ИспользованиедирективыVIRTUAL
paramdd?
virtual at param
LowPartdw?
HighPartdw?
end virtual
virtual at param
Byte1 db?
Byte2 db?
Byte3 db?
Byte4 db?
endvirtual
В примере, описанном в листинге, обратившись к переменной LowPart мы получим младшую часть переменной param, а обратившись к переменной Byte3 получим третий байт переменной param, или первый байт переменной HighPart.
Также с помощью данной директивы можно задавать данные, находящиеся по адресу, который адресует какой-нибудь регистр общего назначения, например:
Тогда инструкция
movbl, [Char1] - то же самое, что и
movbl, [еах], а инструкция
movbl, [Char3 ] - то же самое, что и
movbl, [ еах+2 ]. Но более удобным и понятным был бы вариант использования этой директивы, приведённый в следующем листинге
|
|
История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...
История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...
Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!