Формат хранения данных в памяти — КиберПедия 

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Формат хранения данных в памяти

2022-10-04 25
Формат хранения данных в памяти 0.00 из 5.00 0 оценок
Заказать работу

Пример использования команды MOV. Предположим, у нас есть область памяти:

 

 

Теперь, допустим, есть команда

movеах, dword [0000027Ah]

После выполнения этой команды регистр ЕАХ будет содержать значение 725E7A25h. Возможно, вы заметили, что это инверсия того, что находится в памяти: 25 7А 5Е 72. Это происходит потому, что значения сохраняются в памяти, используя формат littleendian. Суть в том, что самый младший байт сохраняется в наиболее значимом (т. е. с меньшим адресом) байте: указывается обратный порядок байтов.

Числа в процессоре могут быть только целые: знаковые и беззнаковые. Вещественные числа всё равно представляются в двоичном виде как 32-, 64-, 80-битные значения. Оперировать вещественными значениями как таковыми может только математический сопроцессор. Работа с вещественными числами требует отдельного рассмотрения и описываться не будет.

 

Команды SUB и ADD

Команда ADD, как уже понятно из названия, складывает оба операнда и сохраняет полученный результат в операнде назначения. Синтаксис команды ADD: add<назначение>, <источник> Формат операндов идентичен формату операндов команды MOV. Оба операнда складываются, и результат сохраняется в назначении. После операции сложения в зависимости от результата изменяются соответствующие биты в регистре флагов.

Команда SUB производит вычитание - а если быть точнее, то из операнда назначения она вычитает операнд источника и сохраняет его в операнде назначения. Синтаксис команды SUB полностью идентичен команде ADD.

Если после сложения (вычитания) двух операндов результат не помещается в операнде назначения (число слишком большое и отрицательное), происходит переполнение и флаг OF устанавливается в 1. Если произошёл перенос или заём из старшего бита (например, из бита 17 или 33), то устанавливается флаг переноса. Обычно эти два флага всегда сопутствуют друг другу, т. е. если устанавливается один, то устанавливается и второй. В случае вычитания может и не установиться флаг переполнения. Но не будем сейчас фокусироваться на этих флагах - более подробно работа с числами и с флагами OF и CF будет рассмотрена далее.

Также есть ещё две команды увеличения и уменьшения операнда - это INC и DEC. Эти команды увеличивают и уменьшают операнд на единицу соответственно. Они принимают только один операнд, в качестве которого может выступать регистр или значение памяти. Размер операнда может быть любым (1, 2, 4, 8 байт).

В качестве параметров всех вышеописанных команд могут выступать как знаковые, так и беззнаковые числа.

 

 

Логические операции

 

Следующие по важности команды - это команды, осуществляющие логические операции. Есть несколько базовых логических операций: операция «или» (команда OR), логическое «и» (команда AND), логическое отрицание (команда NOT), «исключающее или» (команда XOR).

Команда OR - операция битового логического ИЛИ. Синтаксис команды:

or<назначение>, <источник>

 Эта команда производит побитовое логическое сложение между переданными операндами и сохраняет результат в назначении. Операнды могут быть размером 1, 2, 4, 8 байт. При логическом сложении результат является единицей (истиной) при истинности любого из операндов.

Команда AND - операция битового логического И. Синтаксис команды:

and<назначение>, <источник>

 Эта команда производит побитовое логическое умножение переданных операндов и сохраняет результат в назначении. Операнды могут быть размером 1, 2, 4, 8 байт. При логическом умножении результат является единицей (истиной) при истинности обоих операндов.

Команда NOT - операция битового логического отрицания. Синтаксис команды:

not<назначение>

 Эта команда производит побитовое логическое отрицание операнда. При логическом отрицании результат является отрицанием операнда, т. е. если 1, то получается 0, если 0 - то получается 1. Операнд может быть размером 1, 2,4, 8 байт.

 

Команда XOR - операция битового исключающего ИЛИ. Синтаксис команды:

хог<назначение>, <источник>

Команда XOR производит операцию побитового исключающего «или» над переданными операндами и сохраняет результат в назначении. Операнды могут быть размером 1, 2, 4, 8 байт.

Можно сделать вывод: если операнды одинаковые, то результат 0, если разные - то 1. Таким образом, если указать в качестве обоих операндов один и тот же регистр, то регистр будет обнулён. Этот приём бывает очень полезным при оптимизации кода.

Все четыре вышеперечисленные логические операции в зависимости от результата операции изменяют соответствующие биты в регистре флагов.

 

 

Сдвиги

 

Сдвиг - это побитовый сдвиг операнда вправо или влево. Например, сдвиг числа 11101001 на З влево в результате даст 01001000. Все команды сдвига имеют одинаковый синтаксис:

команда <назначение>, <количество битов>

Сдвиги бывают разных видов: циклические, арифметические и логические. Начнём с логических.

SHL - логический сдвиг влево. Команда производит сдвиг операнда влево на указанное количество бит. В освободившиеся справа биты заносятся нули. Значение CF совпадает со значением бита, который последним был вытеснен за левый край операнда. Если количество битов не равно 1, то признак переполнения OF не определён. Если же количество битов равно 1, тогда OF = 0, при том что 2 старших бита исходного значения операнда назначения совпадали; иначе OF = 1.

SHR - логический сдвиг вправо. Команда производит сдвиг операнда вправо на указанное количество битов. В освободившиеся слева биты заносятся нули. Значение CF совпадает со значением бита, который последним был вытеснен за правый край операнда. Если бит знака сохраняет свое значение, то признак переполнения OF = 0, иначе OF = 1. Значение CF совпадает со значением бита, который последним был вытеснен за правый край операнда. Если количество битов не равно 1, то признак переполнения OF не определен. Если же количество равно 1, то флаг OF равен значению старшего бита исходного операнда.

SAL - арифметический сдвиг влево. Команда полностью идентична команде SHL. Это одна и та же команда, только имена разные.

SAR - арифметический сдвиг вправо. Команда идентична команде SHR, за исключением того, что каждый вновь вставленный слева бит равен самому старшему биту изначального операнда. Таким образом, при арифметическом сдвиге вправо операнд не изменит свой знак. Например, сдвиг числа 10101001 на З бита вправо в результате даст 11110101.

ROL - циклический сдвиг влево. Команда сдвигает операнд влево на указанное количество битов. Бит, который выходит за левый предел, вставляется справа. Значение CF совпадает со значением бита, который последним был вытеснен за левый край операнда. Если количество битов не равно 1, то признак переполнения OF не определен. Если же количество битов равно 1, то во флаг OF заносится результат выполнения операции исключающего «или», примененной к 2 старшим битам исходного значения операнда.

ROR - циклический сдвиг вправо. Команда сдвигает операнд вправо на указанное количество битов. Бит, который выходит за правый предел, вставляется слева. Значение CF совпадает со значением бита, который последним был вытеснен за правый край операнда. Если количество битов не равно 1, то признак переполнения OF не определен. Если же количество битов равно 1, то в OF заносится результат выполнения операции исключающего «или», примененной к 2 старшим битам результата.

RCL - циклический сдвиг влево через флаг СF. Команда сдвигает операнд влево на указанное количество битов. Бит, который выходит за левый край, заносится во флаг CF, а старое значение CF заносится в освободившийся правый бит. Если количество битов не равно 1, то признак переполнения OF не определен. Если же количество битов равно 1, то в OF заносится результат выполнения операции исключающего «или», применённой к 2 старшим битам результата.

RCR - циклический сдвиг вправо через флаг СF. Команда сдвигает операнд вправо на указанное количество битов. Бит, который выходит за правый край, заносится во флаг CF, а старое значение CF заносится в освободившийся левый бит. Если количество битов не равно 1, то признак переполнения OF не определен. Если же количество битов равно 1, то в OF заносится результат выполнения операции исключающего «или», применённой к 2 старшим битам результата.

У всех команд операнд назначения может быть размером 1, 2, 4, 8 байт.

 

 

Работа с флагами процессора

 

Состояние некоторых наиболее часто используемых битов в регистре флагов можно изменить, используя специально отведённые для этого команды. Ниже перечислены команды, работающие с флагами процессора:

1. CLC - сброс флага переноса (CF=0).

2. CLD - сброс флага направления (DF=0).

3. CLI - сброс флага разрешения прерываний (IF=0).

4. LAHF - сохранение в регистре АН содержимого первого байта регистра флагов (флаги SF, ZF, AF, PF, CF)

5. SAHF - сохранение регистра АН в первый байт регистра флагов (флаги SF, ZF, AF,       PF, CF); биты с зарезервированными значениями игнорируются.

6. STC - установка флага переноса в единицу (CF=1).

7. STD - установка флага направления в единицу (DF=1).

8. STI - разрешения прерываний (IF=1).

Все команды, кроме CLI и STI, являются непривилегированными: вы не всегда можете свободно использовать их в своих программах.

 

Работа со стеком

 

На верхушку стека указывает регистр ESP (SP, RSP). Есть две команды, которые работают со стеком: PUSH и POP. Команда PUSH «заталкивает» в стек операнд; если операнд меньше размера элемента стека, то он дополняется нулями. Синтаксис команд PUSH/POP:

push/pop<операнд>

Операнд может иметь размер 2,4, 8 байт в зависимости от режима; также он может быть сегментным регистром. У команды POP операнд не может быть непосредственно значением (т.е. только адресом).

Команда PUSH присваивает памяти, на которую указывает ESP (SP, RSP), значение операнда и уменьшает значение этого регистра на 2,4 или 8 байт в зависимости от режима. Команда POP работает аналогично, только наоборот. Чтобы лучше понять принцип работы команд PUSH/POP, приведем их эквиваленты.

Эквивалент команды PUSH:

subesp, 4

mov [esp], <операнд>

Эквивалент команды POP:

mov <операнд>,[esp]

add esp, 4

Приведённые эквиваленты справедливы для операндов размером 32 бита; для операндов размером 16 и 64 бита увеличение и уменьшение значения регистра ESP будет производиться на 2 и 8 байт соответственно. Следует помнить, что в каждом режиме процессора есть свои ограничения на размер операнда, помещаемого в стек.

 

 

В предыдущем разделе были рассмотрены основные и наиболее важные команды ассемблера. Изучены команда пересылки данных MOV, команда сложения и вычитания, битовых сдвигов и др.


 

Арифметические команды (2ч)


Поделиться с друзьями:

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.009 с.