Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1335
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

http://www.sklyaroff.ru

71

ДЕНЬ 4

Основные команды ассемблера

Сегодня мы рассмотрим команды ассемблера, которые наиболее часто используются

впрограммах на ассемблере.

4.1.Команды пересылки

Существует две основные команды пересылки – MOV и XCHG.

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

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

С помощью команды MOV вы можете пересылать значение из источника в приемник. Несмотря на свое название "move" (от англ. — "перемещать"), команда на самом деле копирует значение из источника в приемник, а не перемещает.

Запомните: ни одна машинная команда не способна манипулировать одновременно двумя операндами, находящимися в оперативной памяти.

По этой причине возможны только следующие сочетания операндов в команде mov: mov регистр,регистр ; нельзя использовать одновременно два сегментных

; регистра

mov регистр,память mov память,регистр

mov регистр,непосредственный операнд ; нельзя использовать сегментный

; регистр

mov память,непосредственный операнд

Непосредственный операнд — это просто константа (число), которая может быть представлена именем (строкой, выражением), определенным с помощью операторов

EQU или =.

Пересылка типа память-память невозможна. Исключениями в представленных сочетаниях также является то, что нельзя пересылать данные из одного сегментного регистра в другой и записывать непосредственный операнд в сегментный регистр — для этого нужно использовать промежуточные несегментные регистры.

Примеры:

mov ax,bx

; mov регистр,регистр

mov es,cs

; Ошибка! Нельзя использовать одновременно два

 

; сегментных регистра.

mov eax,[00504032h]

; mov регистр,память

mov [di],bx

; mov память,регистр

mov [si],[80000h]

; Ошибка! Нельзя пересылать из памяти в память.

http://www.sklyaroff.ru

 

72

mem db 5

; Определение данного в памяти.

mov al,mem

; Копирование из памяти в регистр.

mov ax,100

; mov регистр,непосредственный операнд

mov ds,100

; Ошибка! Нельзя в сегментный регистр пересылать

 

; непосредственный операнд.

mov ds,ax

; А вот сейчас правильно.

mov [si],64h

; mov память,непосредственный операнд

Запись в квадратных скобочках, например [00504032h] означает, что нужно взять значение из памяти расположенное по адресу 00504032h. Напомню, что все ячейки памяти имеют уникальные адреса. На рис. 4.1 показан пример пронумерованных ячеек памяти с размещенными в этих ячейках некоторыми данными.

Рис. 4.1. Размещение данных в ячейках памяти

Согласно рисунку команда mov eax,[00504032h] поместит в регистр EAX двойное слово (32-разряда) из памяти начиная с адреса 504032h (по этому адресу расположено число 25h). После выполнения этой команды, регистр EAX будет содержать значение 725E7A25h, т. е. данные из памяти: 72h 5Eh 7Ah 25h . Данные в памяти хранятся в перевернутом виде согласно правилу "младший байт по младшему адресу", поэтому в EAX будет занесено именно значение 725E7A25h, а не 257A5E72h. Ассемблер берет из памяти значение размером в двойное слово, потому что EAX является 32-разрядным регистром, если бы первый операнд был 16разрядным (AX), то из памяти было бы взято значение размеров в одно слово (16разрядов), соответственно в 8-разрядный регистр (AH или AL) было бы помещено значение размером в 8-разрядов (один байт).

Если в команде не указывать квадратные скобки, например: mov eax,00504032h, то в EAX будет просто занесено значение 00504032h, т. к. без скобок, это просто непосредственный операнд (число).

С помощью оператора PTR (см. его описание в разд. 4.2) можно уточнить тип переменной, например можно переписать инструкцию выше следующим образом:

mov eax, dword ptr [00504032h]

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

mov

eax, 403045h

;

Помещает

в

EAX значение 403045h.

mov

dx, [eax]

;

Помещает

в

регистр DX значение размером в слово из

;памяти по адресу указанному в регистре EAX [403045].

Вданном случае ассемблер сам определяет, что из памяти нужно взять значение размером в слово (16 разрядов), так как dx является 16-разрядным регистром.

Важная деталь, в команде MOV приемник не может иметь такой вид: [00504032h]. Нужно обязательно использовать промежуточный регистр, например:

mov si,00504032h mov [si],64h

В итоге по адресу 00504032h будет записано значение 64h.

Нужно также помнить еще об одной важной вещи, что размерность обоих операндов

вкоманде MOV должна совпадать (либо байты, либо слова), иначе ассемблер зафиксирует ошибку. При пересылках никаких преобразований (байта в слово, слова

вбайт) не производится.

Примеры:

http://www.sklyaroff.ru

73

mov ebx,edx

; правильно

 

mov cl,dl

; правильно

 

mov bl,edx

; ошибка! (BL – байт, EDX – двойное слово)

 

mov dx,al

; ошибка! (DX – слово, AL – байт)

 

mov ah,257

; ошибка! (AH — байт, 257 – больше байта)

 

mov bl, [edx]

; правильно, из памяти будет взято значение размером 8 бит.

Никакие флаги команда MOV не меняет.

Часто в программах необходимо переставлять местами какие-либо две величины, и хотя такую перестановку можно делать с помощью одних команд MOV, существует специальная команда для этого:

XCHG операнд1,операнд2

Примеры:

xchg ebx,eax

; Обменять содержимое регистров EBX и EAX.

xchg ax, word ptr [di]

; Обменять содержимое регистра AX и слова в

 

; памяти по адресу в [DI].

xchg al,al

; Эта команда ничего не делает.

По аналогии с MOV команда XCHG не допускает перестановку типа память-память. Поэтому если нужна такая перестановка, то нужно задействовать промежуточный регистр. Например, для обмена значений двухбайтовых переменных X и Y можно поступить так:

mov al,x ; AL=x xchg al,y ; AL=y, y=x mov x,al ; x=y

4.2. Оператор PTR

Оператор PTR используется для переопределения или уточнения типа метки или переменной. Этот оператор имеет следующий синтаксис:

тип PTR выражение

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

 

 

Таблица 4.1. Типы оператора PTR

 

 

 

Тип

Значение

Размер

 

 

 

BYTE

1

Байт

WORD

2

Слово (2 байта)

DWORD

4

Двойное слово (4 байта)

QWORD

8

Учетверенное слово (8 байт)

TBYTE

10

10 байт

NEAR

0FFFFh

Ближний переход

FAR

0FFFEh

Дальний переход

 

 

 

Типы BYTE, WORD, DWORD, QWORD и TWORD используются только с операндами памяти, а типы NEAR и FAR — только с метками.

Если оператор PTR не используется, то транслятор самостоятельно пытается определить тип ссылки или переменной, и, к сожалению, не всегда это делает правильно.

Примеры использования:

mov ax, dword ptr [0000] ; Записать слово расположенное по адресу

; ds:0000 в регистр AX.

mov word ptr Mem,15 ; Запись в ячейку памяти Mem размером в слово ; десятичного числа 15.