Что такое mov в ассемблере

Что такое mov в ассемблере

Эта команда используется для копирования значения из приёмника в источник. Синтаксис команды:

Mov приемник, источник

Пример:

Mov edx, ecx ; правильно

Размер источника и приемника должны быть одинаковыми.

Mov al, ecx; не правильно

Этот код пытается поместить DWORD (32-битное) значение в байт (8 битов).

Правильные команды:

Mov al, bl

Mov cl, dl

Mov cx, dx

Mov ecx, ebx

Можно получить значение из памяти и поместить его в регистр. Например, имеем следующую схему памяти:

смещение 3A 3B 3C 3D 3E 3F
данные 0D 0A 7A 5E EF 7D FF AD C7

Данные, которые имеют смещение 3A: 25, 7A, 5E, 72, EF, и т.д. Чтобы поместить значение со смещения 3A, например, в регистр, можно воспользоваться командой mov:

mov eax, dword ptr [0000003Ah] ; eax=725E7A25h

При работе с памятью самый младший байт сохраняется в наиболее значимом байте: порядок байтов задом на перед.

dword (32-бит) значение 10203040 шестнадцатиричное сохраняется в памяти как: 40, 30, 20, 10

word (16-бит) значение 4050 шестнадцатиричное сохраняется в памяти как: 50, 40

Пример2:

mov cl, byte ptr [34h] ; cl получит значение 0Dh

mov dx, word ptr [3Eh] ; dx получит значение 7DEFh

Размеры данных для префикса ptr:

Размер можно не указывать:

mov eax, [00403045h]

Пример3:

mov eax, 403045h ; eax= 00403045h

mov cx, [eax] ; CX=значение (размера word) из памяти указанной в EAX (403045)

Стековые операции — PUSH, POP.

Стек это область в памяти, на которую указывает регистр стека ESP(SP). Есть две команды, для размещения значения в стеке и извлечения его из стека: PUSH и POP. Команда PUSH размещает значение в стеке, т.е. помещает значение в ячейку памяти, на которую указывает регистр ESP, после этого значение регистра ESP уменьшается на 4. Команда POP извлекает значение из стека, т.е. извлекает значение из ячейки памяти, на которую указывает регистр ESP, после этого увеличивается значение регистра ESP на 4. Значение, помещенное в стек последним, извлекается первым.

Пример:

(1) mov ecx, 100

(2) mov eax, 200

(3) push ecx

(4) push eax

(5) xor ecx, eax

(6) add ecx, 400

(7) mov edx, ecx

(8) pop ebx

(9) pop ecx

1: поместить 100 в ecx

2: поместить 200 в eax

3: разместить значение из ecx (=100) в стеке (размещается первым)

4: разместить значение из eax (=200) в стеке (размещается последним)

5/6/7: выполнение операций над ecx, значение в ecx изменяется

8: извлечение значения из стека в ebx: ebx=200.

9: извлечение значения из стека в ecx: ecx=100.

Пример: Работа со стеком.

Смещение 120A 120B
Значение
ESP

ESP стоит в том месте, на которое он указывает)

Mov ax, 4560h

Push ax

Смещение 120A 120B
Значение
ESP

Mov cx, FFFFh

Push cx

Смещение 120A 120B
Значение FF FF
ESP

Pop edx

Смещение 120A 120B
Значение FF FF
ESP

edx = 4560FFFFh.

Пересылка данных

Поддерживаются начиная с процессора 8086.

mov ,

xchg ,

cmovcc

bswap

Особенности команды mov:

1) нельзя осуществлять пересылку из одной области памяти в другую. При такой необходимости нужно использовать в качестве промежуточного буфера любой доступный регистр общего назначения. Пример: переслать байты из ячейки памяти fls в ячейку fld:

Data

Fls dd 947503b3h

Fld dd ?

Code

Start

Mov eax, fls

Mov fld,eax

End start

2) нельзя загрузить в сегментный регистр значение непосредственно из памяти. Для выполнения такой загрузки нужно использовать промежуточный объект (регистр общего назначения или стек).

3) нельзя пересылать содержимое одного сегментного регистра в другой сегментный регистр. Выполнить такую пересылку можно, используя в качестве промежуточных регистры общего назначения.

Пример: инициализировать регистр es значением регистра ds:

Mov ax,ds

Move es,ax

Можно также использовать стек и команды push и pop:

Push ds ; поместить значение регистра ds в стек

Pop es ; записать в es число из стека

Нельзя использовать сегментный регистр cs в качестве операнда назначения.

5) оператор ptr можно применять и когда требуется принудительно поменять размерность операндов. К примеру, требуется переслать значение 0ffh во второй байт поля flp:

Читайте также:  Почему тормозит яндекс навигатор в смартфоне

Data

Flp dw ?

Code

start:

mov byte ptr (flp+1),0ffh

End start

Для двунаправленной пересылки данных применяют команду xchg. Эту же операцию можно выполнить применив последовательность из нескольких команд mov. Общий вид записи:

XCHG ,

Содержимое операнда2 копируется в операнд1, а старое содержимое операнда1 — в операнд2. XCHG можно выполнять над двумя регистрами или над регистром и переменной.

Например:

Xchg eax,ebx ; обменять содержимое регистров eax и ebx.

То же, что три команды на языке С:

Xchg al,al ; а эта команда не делает ничего

xchg ax, word ptr [si] ; обменять содержимое регистра ах и слова в памяти по адресу в [si].

Для условной пересылки данных используется команда:

CMOVcc

Набор команд, которые копируют содержимое источника в приемник, если удовлетворяется то или иное условие.

Можно использовать команды CMOVcc сразу после команды СМР (сравнение) с теми же операндами, например:

Последнее изменение этой страницы: 2016-09-13; Нарушение авторского права страницы

РОН являются основными рабочими регистрами ассемблерных программ. Их отличает то, что к ним можно адресоваться одним словом или однобайтовым кодом. Левый байт считается старшим, правый – младшим.

Регистр АХ является основным сумматором и применяется во всех операциях ввода-вывода, в некоторых операциях со строками и в некоторых арифметических операциях.

НАПРИМЕР, команды умножения, деления и сдвига предполагают использование регистра АХ . ( АХ: AH AL)

Регистр ВХ – базовый регистр, единственный из регистров общего назначения, используемый в индексной адресации. Кроме того, регистр ВХ используется при вычислениях. ( ВХ: ВH ВL)

Регистр СХ – регистр-счетчик. Используется для организации цикла или в командах сдвига влево или вправо. ( СХ: СH СL)

Регистр DХ – регистр данных. Используется в некоторых операциях ввода / вывода, в операциях умножения и деления больших чисел совместно с регистром АХ.(DХ: DH DL)

Любой из РОН может быть использован для суммирования или вычитания 8-, 16- или 32-разрядных величин.

Команда mov.

Команда Mov — Пересылка (байта или слова). Признаки не меняются.

Рассмотрим примеры использования данной команды с применением имен, имен в квадратных скобках и чисел. Предположим, WORDAS – слово в памяти.

Mov AX, BX переслать содержимое ВХ в регистр АХ

Mov АХ, 28 переслать значение 28 в регистр АХ

Mov АХ, WORDAS переслать WORDAS в регистр АХ

Mov AX, [BX] переслать содержимое памяти по адресу в регистре ВХ в регистр АХ

Mov AX, [28] переслать содержимое по смещению 28

26. Назначение сегментов. Реализация арифметических операций на ассемблере. Назначение сегментов

Сегмент – некоторая область памяти, которая начинается на границе параграфа, т.е. по адресу кратному 16.

Существует 3 сегмента размером до 64 КБт, которые располагаются в любом месте памяти.

Регистр CS – регистр сегмента кода – содержит начальный адрес этого сегмента.

В сегменте кода содержится все машинные команды, которые необходимо выполнить в сегменте кода (по аналогии begin ….end).

2. Регистр DS – регистр сегмента данных – содержит начальный адрес сегмента данных.

В сегменте данных расположены константы и различные рабочие области.

3. Регистр SS – регистр сегмента стека – содержит адрес возврата в операционную систему, а также используется для вызова подпрограмм.

4. Дополнительные регистры сегмента данных ES, GS, FS

При их использовании их адреса должны быть указаны явно с помощью специальных префиксов переопределения сегментов в команде. Все адреса команд относительны начала сегмента. Такие адреса называются СМЕЩЕНИЕМ.

Для обращения по любому адресу в программе компьютер складывает адрес в регистре сегмента со смещением.

Размер смещения: 0000 до FFFF (15*16 3 +15*16 2 +15*16+15= 65535)

Формирование физического адреса:

адрес в регистре сегмента умножается на 10h.

к полученному числу прибавляется соответствующее смещене.

h – 16; b – 2; d – 10; 0 – 8.

Регистр IP – регистр указания команд – в этом регистре хранится смещение выполняемой команды.

Регистр E Flogs – 32-х разрядный регистр – регистр флагов.

Читайте также:  Как перевести в другой формат файл

Машинный язык предполагает организацию операций вычислений или запись команд в виде совокупности цифр 16 – ой системы.

Команда ADD (сложение) и SUB (вычитание) выполняют сложение и вычитание байтов или слов, содержащих двоичные данные. Вычитание осуществляется в компьютере по методу сложения с двоичным дополнением: для второго операнда устанавливаются обратные значения битов, и прибавляется 1, а затем происходит сложение с первым операндом. Во всем, кроме первого шага операции сложения и вычитания идентичны. Оба операнда могут быть байтами или словами, и оба операнда могут быть двоичными числами со знаком или без знака.

Возможные ситуации сложения / вычитания: регистр – регистр, регистр – память, память – регистр, регистр – непосредственное значение, память – непосредственное значение.

ADD ВН, 10h непосредственное значение и регистр ВН

ADD АХ, ВХ регистр и регистр

ADD WORDAS, СХ память и регистр

ADD АХ, [DХ] регистр и память

SUB WORDAS, BХ регистр и3 память

SUB BХ, 100h непосредственное значение из регистр

SUB WORDAS, 16h непосредственное значение из памяти

Один байт содержит знаковый бит и семь битов данных, т.е. результат арифметической операции может легко превзойти емкость регистра, и возникает переполнение. Полное слово имеет также ограничение, что ограничивает возможности компьютера для выполнения арифметической операции. Поэтому используют специальные сопроцессоры, которые быстро и эффективно выполняют эти операции, представляя числа в специальных кодах. Иногда вместо команды ADD используют команду ADC – сложение с переносом, которая складывает два значения и, если флаг уже установлен, к сумме прибавляется 1.для аналогичных целей (вычитание с заемом) вместо команды SUB используется команда SBB.

Числовое содержимое поля может интерпретироваться по-разному. Многие числовые поля являются беззнаковыми, например, номер абонента, адрес памяти. Некоторые числовые поля предполагаются всегда положительными, например, норма выплаты, день недели, число Р1. Другие числовые поля являются знаковыми, т.к. их содержимое может быть как положительным, так и отрицательным. Команды ADD и SUB не делают разницы между знаковыми и беззнаковыми данными они просто складывают и вычитают биты.

НАПРИМЕР, для беззнакового числа биты представляют число 249, а для знакового -7:

Влияние команды на флаги и форматы команды:

Описание:

Команда MOV копирует второй операнд (операнд-источник) в первый операнд (операнд-назначение). Оба операнда могут быть регистрами общего назначения, сегментными регистрами, непосредственными значениями и переменными в памяти. Оба операнда должны иметь одинаковую размерность — байт, слово или двойное слово.

Если операнд-назначение — сегментный регистр (DS, ES, FS, GS или SS), тогда в скрытую часть этого регистра также загружаются данные из соответствующего дескриптора. Эти данные извлекаются из элемента таблицы дескрипторов для данного селектора. Сегментный регистр CS не может быть загружен командой MOV. Попытка использования соответствующего кода приводит к генерации особой ситуации #UD. Для загрузки регистра CS должны использоваться команды JMP, CALL или RET.

Пустой селектор (значения 0000, … 0003) может быть загружен в регистры DS, ES, FS и GS не вызывая особой ситуации. Однако попытка использования нулевых селекторов при обращении к памяти вызывает особую ситуацию #GP(0), и никакого обращения к памяти не происходит.

Ниже представлен листинг всех проверок и действий, предпринимаемых процессором при загрузке сегментного регистра в защищенном режиме:

IF (Загружается SS)

IF (Селектор не нулевой) THEN #GP(0); FI;

Индекс селектора должен попадать в пределы таблицы дескрипторов, иначе #GP(Селектор);

Поле RPL селектора должно быть равно CPL, иначе #GP(Селектор);

AR байт должен задавать сегмент данных, доступный для записи, иначе #GP(Селектор);

Поле DPL AR байта должно быть равно CPL, иначе #GP(Селектор);

Сегмент должен быть помечен, как присутствующий, иначе #SS(Селектор);

Загрузить SS селектором;

Загрузить SS дескриптором;

IF (загружается DS, ES, FS или GS не нулевым селектором)

Индекс селектора должен попадать в пределы таблицы дескрипторов, иначе #GP(Селектор);

AR байт должен задавать сегмент данных, или кодовый сегмент доступный для чтения, иначе #GP(Селектор);

IF (Данные или несогласованный код)

THEN RPL и CPL должны быть меньше или равны DPL в AR байте, иначе #GP(Селектор);

Читайте также:  Какая максимальная скорость интернета yota

Сегмент должен быть помечен, как присутствующий, иначе #NP(Селектор);

Загрузить селектор в сегментный регистр;

Загрузить дескриптор в сегментный регистр;

IF (Загружается DS, ES, FS или GS нулевым селектором)

Загрузить селектор в сегментный регистр;

Очистить внутренний флаг корректности дескриптора (descriptor valid bit);

Команда загрузки сегмента стека SS запрещает все прерывания до завершения выполнения следующей команды (которая может быть командой MOV в ESP). Более эффективным методом загрузки нового указателя стека является команда LSS. Существуют и другие команды, которые задерживают прием прерываний при выполнении следующей за ними команды, но комбинация таких команд (например, STI и MOV SS,EAX) не означает, что прерывания не будут восприниматься на протяжении двух команд. Такие последовательности могут вызвать серьезные сбои, т.к. станет возможным поступление прерывания сразу после команды загрузки стекового сегмента SS.

В процессорах 32-разрядной архитектуры (Intel386, …) команды пересылки между сегментными регистрами и регистрами общего назначения не требуют наличия префикса 16-битного размера операнда (66h) не зависимо от текущего режима работы. Т.е. в этом случае всегда пересылаются 16-битные данные. Многие ассемблеры при встрече подобных мнемоник (например, MOV DS,AX) автоматически вставляют префикс 16-битного размера операнда перед командой пересылки. Это не влияет на результат исполнения команды, а замедляет только время исполнения. Простейшим выходом из данной ситуации является программирование 32-битной мнемоники (MOV DS,EAX), она преобразуется ассемблером в тот же самый код операции, но без префикса размера операнда. Поскольку пересылка данных в этом случае происходит межу 16-битным и 32-битным регистрами, то в 32-битном регистре в операции учавствуют только его младшие 16 бит. Если 32-битный регистр является операндом-назначением такой операции, то значения в его старших 16 битах после окончания пересылки могут быть различны в различных моделях процессоров. В Pentium Pro, … они заполняются нулями, а для более ранних процессоров Intel их значения не определены.

Операция:

Особые ситуации защищенного режима:

#GP(0), если операнд-назначение находится в сегменте, запрещенном для записи, если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор, а также при попытке загрузки регистра SS нулевым селектором.
#GP(Селектор), если индекс загруженного селектора не попадает в пределы таблицы дескрипторов, если при загрузке регистра SS запрашиваемый уровень привилегий селектора RPL или уровень привилегий соответствующего дескриптора сегмента DPL не равны текущему уровню привилегий CPL, если регистр SS загружается селектором, который указывает на сегмент запрещенный для записи, если регистр DS, ES, FS или GS загружается селектором сегмента, который не является доступным для чтения кодовым сегментом или сегментом данных, если регистр DS, ES, FS или GS загружается селектором сегмента, который является сегментом данных или несогласованным кодовым сегментом, и уровень привилегий дескриптора этого сегмента DPL меньше по значению запрашиваемого уровня привилегий селектора RPL и текущего уровня привилегий CPL.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#SS(Селектор), если регистр SS загружается селектором сегмента, который помечен как неприсутствующий.
#NP(Селектор), если регистр DS, ES, FS или GS загружается селектором сегмента, который помечен как неприсутствующий.
#PF(Код ошибки), страничная ошибка.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.
#UD при попытке загрузки регистра CS.

Особые ситуации режима реальной адресации:

#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS.
#UD при попытке загрузки регистра CS.

Особые ситуации режима V86:

Такие же, как и в режиме реальной адресации.
#PF(Код ошибки), страничная ошибка.
#AC(0) при невыровненной ссылке в память.

Замечание:

В процессоре Pentium III существуют некоторые ситуации, когда отладчик будет получать неверную информацию в регистрах отладки от команд MOV SS и POP SS. Обратитесь к технической документации Intel за описанием всех возможных случаев проявления ошибки.

Ссылка на основную публикацию
Что значит загрузочная флешка
Что такое загрузочная флешка / 8 способов создать загрузочную флешку Что такое загрузочная флешка / 8 способов создать загрузочную флешку...
Чему равна сумма бесконечно убывающей геометрической прогрессии
ЧИСЛОВЫЕ ПОСЛЕДОВАТЕЛЬНОСТИ VI § l48. Сумма бесконечно убывающей геометрической прогрессии До сих пор, говоря о суммах, мы всегда предполагали, что...
Чем стереть автомобильную краску
Автомобили настолько плотно вошли в нашу жизнь, что большинство людей не представляет свою жизнь без персонального транспортного средства. Машина —...
Что значит заблокировать сообщение в телефоне
Текстовые сообщения очень удобны – ведь с их помощью вы можете получить информацию от другого абонента даже в тот момент,...
Adblock detector