Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Первая команда в ассемблере 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:

Byte - 1 байт

Word - 2 байта

Dword - 4 байта

 

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

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 <операнд1>, <операнд2>

cmovcc <приёмник><источник>

bswap <регистр 32>

 

Особенности команды 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 <операнд1>, <операнд2>

 

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

Например:

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

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

temp = eax;

eax = ebx;

ebx = temp;

 

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

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

 


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

CMOVcc <приёмник><источник>

 

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

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



Поделиться:


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

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.78.65 (0.008 с.)