Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
госы / СПО ЭВМ.docx
Скачиваний:
36
Добавлен:
10.04.2015
Размер:
134.22 Кб
Скачать
  1. Команды пересылки, сравнения и сдвига денных в ассемблерных программах.

Команды пересылки данных, MOV — пересылка данных

Команда MOV замещает первый операнд (приемник) вторым (источником). При этом исходное значение первого операнда теряется. В зависимости от описания операндов пересылается слово или байт. Если операнды описаны по-разному или режим адресации не позволяет однозначно определить размер операнда, для уточнения размера передаваемых данных в команду следует включить один из атрибутных операторов byte ptr или word ptr. В зависимости от использованных режимов адресации команда MOV может осуществлять пересылки следующих видов:

из регистра общего назначения в регистр общего назначения;

из ячейки памяти в регистр общего назначения;

из регистра общего назначения в ячейку памяти;

непосредственный операнд в регистр общего назначения;

непосредственный операнд в ячейку памяти;

из регистра общего назначения в сегментные регистры DS, ES;SS;

из сегментного регистра в регистр общего назначения;

из сегментного регистра в ячейку памяти.

Запрещены пересылки из ячейки памяти в ячейку памяти (для этого предусмотрена команда MOVS), а также загрузка сегментного регистра непосредственным значением, которое, таким образом, приходится загружать через регистр общего назначения:

mov AX, seg mem ; Сегментный адрес ячейки mem mov DS, АХ ;3агрузка его в регистр DS Нельзя также непосредственно переслать содержимое одного сегментного регистра в другой. Такого рода операции удобно выполнять с использованием стека: push DS ;

pop ES ;Содержимое DS копируется в ES

пример:

mov BX, ES ;Из сегментного регистра в регистр

mov SS, [SI] ;Из памяти в сегментный регистр

XCHG - Обмен данными между операндами

Команда XCHG пересылает значение первого операнда во второй, а второго - в первый. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве , второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Пример:

movAX.OFFOlh

mov SI, 1000

xchg AX, SI ;AX=3E8h=1000, SI=FF01h

PUSH - Занесение операнда в стек

Команда PUSH уменьшает на 2 содержимое указателя стека SP и заносит на эту новую вершину содержимое двух-байтового операнда-источника. В качестве операнда-источника может использоваться любой 16-разрядный регистр (включая сегментные) или ячейка памяти.

Пример:

push AX ;Сохранение АХ

pushCS Сохранение CS

push ES:mem Сохранение содержимого слова

;памяти mem из дополнительного

;сегмента

POP - Извлечение слова из стека

Команда POP пересылает слово из вершины (на которую указывает регистр SP) по адресу операнда-приемника. Затем содержимое SP увеличивается на 2 и указывает на новую вершину стека. В качестве операнда-приемника можно использовать любой 16- разрядный регистр (кроме CS) или ячейку памяти. Команда IN вводит в регистр AL или АХ соответственно байт или слово из порта, указываемого вторым операндом. Адрес порта помещается в регистр DX. Если адрес порта не превышает 255, он может быть указан непосредственным значением. Указание регистра-приемника (AL или АХ) обязательно.

Пример 1:

in AL, 60h ;Ввод байта из порта 60h

Пример 2:

mov DX, 3D5h ;Адрес порта in AX, DX ;Ввод слова из порта 3D5h

OUT - Вывод в порт

Команда OUT выводит в порт, указываемый первым операндом, байт или слово соответственно из регистра AL или АХ. Адрес порта помещается в регистр DX. Если адрес порта не превышает 255, он может быть указан непосредственным значением. Указание регистра-источника (AL или АН) обязательно.

Пример 1:

out61h, AL Пример 2:

mov DX, 3CEh mov AL,

out DX, AL

;Вывод байта в порт 61h из AL

;Адрес порта ;Данное

XLAT — Табличная трансляция

Команда XLAT осуществляет выборку байта из таблицы. В регистре ВХ должен находиться относительный адрес таблицы, а в регистре AL - смещение в таблице к выбираемому байту (его индекс). Выбранный байт загружается в регистр AL, замещая находившееся в нем смещение. Длина таблицы может достигать 256 байтов. Команда XLAT не имеет явных операндов, но требует предварительной настройки регистров ВХ и AL.

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

TEST - Логическое сравнение

Команда TEST выполняет операцию логического И над двумя операндами и в зависимости от результата устанавливает флаги SF, ZF и PF. Флаги OF и CF сбрасываются, a AF имеет неопределенное значение. Состояние флагов можно затем проанализировать командами условных переходов. Команда TEST не изменяет ни один из операндов. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти.

CMP - Сравнение

Команда CMP выполняет вычитание второго операнда из первого. В соответствии с результатом вычитания устанавливаются состояния флагов CF, PF, AF, ZF, SF и OF. Сами операнды не изменяются.

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

Обычно вслед за командой СМР стоит одна из команд условных переходов, анализирующих состояние флагов процессора. Пример:

Пример:

cmp AX, 562Dh

je equal ;Переход на метку equal,

;если AX=562Dh

SAL, SHL - SAL/SHL Арифметический сдвиг влево/логический сдвиг влево

Команда SAL осуществляет сдвиг влево всех битов операнда. Старший бит операнда поступает в флаг CF. Если команда записана в формате:

SAL операнд, 1

сдвиг осуществляется на 1 бит. В младший бит операнда загружается 0. Если команда записана в формате:

SAL операнд, CL

сдвиг осуществляется на число битов, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда, пройдя через флаг CF, теряются, а младшие заполняются нулями. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Каждый сдвиг влево эквивалентен умножению знакового числа на 2, поэтому команду SAL удобно использовать для возведения операнда в степень 2. Поскольку логический сдвиг влево полностью эквивалентен арифметическому сдвигу влево, команда SHL является просто другим обозначением команды SAL.

Пример 2:

mov AX, 1FFh

mov CL, 2

sal AX, CL; AX=07FCh=lFFh*4

SAR - Арифметический сдвиг вправо

Команда SAR осуществляет сдвиг вправо всех битов операнда. Младший бит операнда поступает в флаг CF. Если команда записана в формате:

SAR операнд, 1

сдвиг осуществляется на 1 бит. Старший бит операнда сохранят свое значение. Если команда записана в формате:

SAR операнд, CL

сдвиг осуществляется на число битов, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда, пройдя через флаг CF, теряются, а старший бит расширяется вправо. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Каждый сдвиг вправо эквивалентен делению знакового числа на 2, поэтому команду SAR удобно использовать для деления операнда на целые степени 2.

Пример 1:

mov AL, 7

sar AL, 1 ;AL=3=7/2. Остаток потерян

SHR - Логический сдвиг вправо

Команда SHR осуществляет сдвиг вправо всех бит операнда. Младший бит операнда поступает в флаг CF. Если команда записана в формате:

shr операнд, 1

сдвиг осуществляется на 1 бит. В старший бит операнда загружается 0, а младший теряется. Если команда записана в формате:

SHR операнд, CL

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

Пример 1:

mov AL, 7

shr AL, 1 ;AL=3

Команда RCR осуществляет сдвиг вправо всех бит операнда. Если команда записана в формате:

RCR операнд, 1

сдвиг осуществляется на 1 бит. В старший бит операнда заносится значение флага CF; младший бит операнда загружается в CF. Если команда записана в формате:

RCR операнд, CL

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

Пример 1:

clc ;Сбросим CF

movAX, 2

rcr AX, 1 ;AX=2; CF=O

ROL - Циклический сдвиг влево

Команда ROL осуществляет сдвиг влево всех бит операнда. Если команда записана в формате:

ROL операнд, 1

сдвиг осуществляется на 1 бит. Старший бит операнда мгружается в его младший разряд. Если команда записана в формате:

ROL операнд, CL

сдвиг осуществляется на число бит, указанное в регистре-ечетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда перемещаются в его младшие разряды. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение.

Пример 1:

mov AX, 1

rol AX, 1 ;AX=0002h

Циклический сдвиг вправо

Команда ROR осуществляет сдвиг вправо всех бит операнда. Если команда записана в формате:

ROR операнд, 1

сдвиг осуществляется на 1 бит. Младший бит операнда чаписывается в его старший разряд. Если команда записана в формате:

ROR операнд, CL

сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда перемещаются в его старшие разряды. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение.

Пример 1:

mov AX, 2

ror АХ, 1; AX=1

SAL, SHL - SAL/SHL Арифметический сдвиг j влево/логический сдвиг влево

Команда SAL осуществляет сдвиг влево всех битов операнда. Старший бит операнда поступает в флаг CF. Если команда записана в формате:

SAL операнд, 1

сдвиг осуществляется на 1 бит. В младший бит операнда загружается 0. Если команда записана в формате:

SAL операнд, CL

сдвиг осуществляется на число битов, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда, пройдя через флаг CF, теряются, а младшие , заполняются нулями. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Каждый сдвиг влево эквивалентен умножению знакового числа на 2, поэтому команду SAL удобно использовать для возведения операнда в степень 2. Поскольку логический сдвиг влево полностью эквивалентен арифметическому сдвигу влево, команда SHL является просто другим обозначением команды SAL.

Пример 1:

mov AL, 7

sal AL, 1 ;AL=0Eh=7*2

Соседние файлы в папке госы