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

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

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

•пересылки данных общего назначения

•ввода-вывода в порт

•работы с адресами и указателями

•работы со стеком

Команды пересылки данных общего назначения

К этой группе относятся следующие команды:

mov – это основная команда пересылки данных . Она реализует самые разнообразные варианты пересылки.

Отметим особенности применения этой команды:

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

К примеру, рассмотрим фрагмент программы для пересылки байта из ячейки fls в ячейку fld:

. нельзя загрузить в сегментный регистр значение непосредственно из памяти. Поэтому для выполнения такой загрузки нужно использовать промежуточный объект. Это может быть регистр общего назначения или стек. В начале сегмента кода две команды mov, выполняющие настройку сегментного регистра ds. При этом из-за невозможности загрузить впрямую в сегментный регистр значение адреса сегмента, содержащееся в предопределенной переменной @data, приходится использовать регистр общего назначения ax;

. нельзя переслать содержимое одного сегментного регистра в другой сегментный регистр. Это объясняется тем, что в системе команд нет соответствующего кода операции. Но необходимость в таком действии часто возникает. Выполнить такую пересылку можно, используя в качестве промежуточных все те же регистры общего назначения. Вот пример инициализации регистра es значением из регистра ds:

Но есть и другой, более красивый способ выполнения данной операции — использование стека и команд push и pop:

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

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

. нельзя использовать сегментный регистр cs в качестве операнда назначения. Причина здесь простая. Дело в том, что в архитектуре микропроцессора пара cs:ip всегда содержит адрес команды, которая должна выполняться следующей. Изменение командой mov содержимого регистра cs фактически означало бы операцию перехода, а не пересылки, что недопустимо.

Схема команды: mov приемник,источник

Назначение: пересылка данных между регистрами или регистрами и памятью.

Алгоритм работы: копирование второго операнда в первый операнд.

Состояние флагов после выполнения команды: !! выполнение команды не влияет на флаги

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

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

•значение второго операнда не изменяется;

•оба операнда не могут быть из памяти (при необходимости можно использовать цепочечную команду movs );

•лишь один из операндов может быть сегментным регистром;

•желательно использовать в качестве одного из операндов регистр al / ax / eax , так как в этом случае TASM генерирует более быструю форму команды mov .

MOV (MOVe operand to/from system registers)

Пересылка операнда в системные регистры (или из них)

Схема команды: mov приемник,источник

Назначение: пересылка данных между регистрами или регистрами и памятью.

Алгоритм работы: копирование второго операнда в первый.

Состояние флагов после выполнения команды:

11 07 06 04 02 00

OF SF ZF AF PF CF

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

;переключение микропроцессора в защищенный

XCHG (eXCHanGe) Обмен

Для двунаправленной пересылки данных применяют команду xchg . Для этой операции можно, конечно, применить последовательность из нескольких команд mov, но из-за того, что операция обмена используется довольно часто, разработчики системы команд микропроцессора посчитали нужным ввести отдельную команду обмена xchg.

Схема команды: xchg операнд_1,операнд_2

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

Алгоритм работы: обмен содержимого операнд_1 и операнд_2.

Состояние флагов после выполнения команды: выполнение команды не влияет на флаги

Команду xchg можно использовать для выполнения операции обмена двух операндов с целью изменения порядка следования байт, слов, двойных слов или их временного сохранения в регистре или памяти. Альтернативой является использование для этой цели стека.

!! операнды должны иметь один тип.

!! Не допускается (как и для всех команд ассемблера) обменивать между собой содержимое двух ячеек памяти.

xchg ax,bx ;обменять содержимое регистров ax и bx

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

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

Команды пересылки данных наиболее часто используются из всего набора команд любого ПК. Задача по обработке данных заключается в переносе информации из одного места в другое.

Команда пересылки MOV — основная команда пересылки данных, которая позволяет переслать содержимое источника (операнд 2) в приемник (операнд 1). Содержимое приемника безвозвратно теряется, содержимое источника не изменится

Формат команды MOV ,

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

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

При использовании команд пересылки необходимо помнить:

– нельзя пересылать данные непосредственно между двумя адресами памяти;

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

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

– при помощи команды MOV нельзя загрузить сегментный регистр CS.

При выполнении команды MOV никакие флаги — не меняются.

Команда замены XCHG

Команда XCHG просто меняет местами между собой содержимое двух операндов (например, двух регистров, или регистра и ячейки памяти).

Формат команды XCHG ,

Команда XCHG заменяет три команды пересылки и не требует промежуточной ячейки памяти.

Если бы не было этой команды, то, чтобы обменять значения в регистрах AX и BX, сначала нужно было бы переслать содержимое AX в рабочую ячейку, затем содержимое BX в AX, а потом содержимое рабочей ячейки в BX. Команда XCHG одна выполняет эту операцию

При выполнении команды XCHG никакие флаги не меняются

С помощью команды LEA можно вычислить и загрузить в один из регистров исполнительный адрес (смещение) операнда в памяти

Формат команды LEA , , где — один из регистров общего назначения, значение которого безвозвратно теряется. Второй операнд является некоторым адресом или адресным выражением. В качестве второго операнда можно использовать любой вид адресации.

Читайте также:  Включение и выключение нагрузки одной кнопкой без фиксации

При выполнении команды LEA никакие флаги микропроцессора, описывающие его состояние, не меняются.

Отличие от команды MOV в том, что по команде MOV загружается значение некоторого участка памяти, а при команде LEA — адрес начала этого участка.

Оператор указания типа — PTR

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

MOV AH,5 ; пересылка байта, т.к. AH – байтовый регистр

MOV AX,5 ; пересылка слова, т.к. AX – 16-битовый регистр

; (операнд 5 может быть байтом и словом, по нему нельзя определить размер пересылаемой величины)

MOV [BX],300 ; пересылка слова, т.к. число 300 не может быть байтом

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

MOV DS,AX ; оба операнда имеют размер слова

MOV CX,BH ; ошибка: регистры CX и BH имеют разные размеры

MOV DL,300 ; ошибка: DL – байтовый регистр, а число 300 не может быть байтом.

Возможны ситуации, когда по внешнему виду операндов нельзя опреде­лить тип ни одного из них, как, например, в команде

Здесь число 5 может быть и байтом, и словом, а адрес из регистра BX может указывать и на байт памяти, и на слово. В подобных ситуациях ас­семблер фиксирует ошибку. Чтобы избежать ее, надо уточнить тип одного из операндов с помощью оператора с названием PTR, который записывается следующим образом:

– это BYTE, WORD, а – может быть константой или адресом, например,

MOV BYTE PTR [BX],5 ; пересылка байта

MOV WORD PTR [BX],5 ; пересылка слова

Оператор PTR необходим и в том случае, когда надо изменить тип, предписанный имени при его описании. Если, например, X описано как имя переменной размером в слово:

и если надо записать в байтовый регистр AH значение только первого байта этого слова, тогда воспользоваться командой

нельзя, т.к. ее операнды имеют разный размер. Эту команду следует за­писать несколько иначе:

MOV AH,BYTE PTR X

Здесь конструкция BYTE PTR X означает адрес X, но уже рассматриваемый не как адрес слова, а как адрес байта. (Напомним, что с одного и того же адреса может начинаться байт, слово и двойное слово; оператор PTR уточняет, ячейку какого размера мы имеем в виду.)

К командам пересылки относятся также команды стека PUSH и POP

Стеком называют область памяти для временного хранения произвольных данных. Удобство стека заключается в том, что его область используется многократно. Размер стека не должен превышать 64 кбайт и начальный адрес должен быть кратен 16. Другими словами, эта область должна быть сег­ментом памяти; он называется сегментом стека, где начальный адрес хранится в регистре SS

В ПК принято стек заполнять снизу вверх: первый элемент записывается в стек в ячейку области с наибольшим адресом (дно стека), следующий элемент записывается над ним и т.д. При считывании из стека первым удаляется самый верхний элемент (признак LIFO — “последним пришёл — первым ушёл”).

Таким образом, получается, что дно стека фиксировано, а вершина стека всё время сдвигается. Для того чтобы знать текущее положение этой вершины, используется регистр SP — указатель стека, в котором хранится адрес той ячейки, где находится элемент, записанный в стек последним.

Следовательно, в SP — находится смещение, т.е. адрес, отсчитанный от начала сегмента стека. Абсолютный адрес вершины стека задается парой регистров SS:SP

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

При занесении элемента в стек, микропроцессор уменьшает значение регистра SP на 2 байта, а затем записывает элемент по адресу новой вершины. При извлечении данных из стека микропроцессор копирует элемент, расположенный по адресу вершины, а затем увеличивает значение регистра указателя стека SP на 2 байта.

Основными стековыми командами являются команды записи слова в стек и считывания слова из стека.

Формат команды: PUSH

Команда PUSH записывает в стек свой операнд, которым может быть слово. Флаги команда не меняет.

Чтение из стека слова: POP

Команда POP считывает слово из вершины стека

Следующая пара стековых команд используется для записи в стек и чтения из стека регистра флагов:

Эти команды обычно используются для сохранения текущих состояний флагов и последующего их восстановления.

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

При работе со стеком необходимо помнить: если мы что-то записали в стек, то обязаны всё это считать из стека (сколько было команд PUSH, столько должно быть команд POP).

Дата добавления: 2014-11-09 ; Просмотров: 2508 ; Нарушение авторских прав?

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

3.11.1 Команды пересылки данных

Команды пересылки данных осуществляют обмен данными или адресами между регистрами МП и ячейками памяти или портами ввода/вывода. Их можно разделить на следующие подгруппы:

1) команды пересылки общего назначения;

2) команды загрузки адресных значений;

3) команды обращения к стеку;

4) команды пересылки флагов;

5) команды ввода/вывода.

Команды пересылки общего назначения

К этой подгруппе относятся команды MOV, XCHG и XLAT.

Команда MOV является основной командой пересылки общего назначения. Она имеет следующий формат:

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

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

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

MOV AX, Table ; Пересылка из памяти в регистр

MOV Table, AX ; и наоборот

MOV ES:[BX],DX ; Пересылка из регистра в память

MOV DS,AX ; Пересылка между 16-битными

MOV BL,AL ; или 8-битными регистрами

MOV CL,30 ; Пересылка константы в регистр

MOV [BX+SI],25h ; или в память

Некоторые из сочетаний операндов в команде MOV недопустимы.

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

MOV Alpha,[BX] ; Ошибка – обращение типа

MOV AX,[BX] ; Пересылка данных из ячейки,

MOV Alpha,AX ; адресуемой BX, в ячейку Alpha

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

MOV DS,0ABCDh ; Ошибка – загрузка константы

MOV AX,0ABCDh ; Загрузка константы

MOV DS,AX ; в регистр DS

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

MOV ES,DS ; Ошибка – пересылка между

MOV AX,ES ; Пересылка между сегментными

MOV DS,AX ; регистрами (из ES в DS)

4. В качестве приемника данных не может использоваться регистр CS, так как его изменение эквивалентно передаче управления, что не является пересылкой данных.

Команда обмена XCHG имеет формат:

Читайте также:  Управление светодиодами ws2813 с адресацией с помощью attiny

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

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

XCHG AX,BX ; Обмен между 16-битными

XCHG AL,DH ; или 8-битными регистрами

XCHG Alpha,DX ; Обмен между ячейкой

XCHG AL,Beta ; памяти и регистром

Ни один из операндов команды XCHG не может быть сегментным регистром.

Команда табличного преобразования XLAT записывается в формате:

XLAT или XLAT таблица-источник

и выполняет преобразование кода из AL в соответствии с выражением (AL)=((BX)+(AL)).

Преобразование осуществляется по таблице, на которую указывает регистр BX. Следовательно, перед выполнением этой команды начальный адрес таблицы необходимо загрузить в регистр BX. Преобразуемый байт должен быть в регистре AL. При выполнении команды XLAT преобразуемый байт используется как индекс таблицы. Он складывается с начальным адресом таблицы, в результате чего формируется адрес ее строки (BX)+(AL), по которой осуществляется преобразование. По этому адресу считывается элемент таблицы и помещается в регистр AL.

Команда XLAT удобна для выполнения преобразований при отсутствии алгоритмической связи между преобразуемыми кодами.

Выполнить быстрое возведение в квадрат числа из ячейки памяти, лежащего в диапазоне 05.

TablConv DB 0,1,4,9,16,25 ;Описание таблицы преобразования

MOV AL,X ;Чтение операнда

MOV BX,OFFSET TablConv ;Загрузка адреса таблицы

XLAT TablConv ;Преобразование

MOV Y,AL ;Запись результата

Указание в команде XLAT имени таблицы-источника необязательно, но предпочтительно, так как позволяет ассемблеру при трансляции программы проверить наличие таблицы и ее корректность.

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

6.1. Типы операндов.

При изучении данной темы мы рассмотрим всего три типа операндов, которые могут встречаться в любой команде: непосредственно заданное значение (immediate), регистр (register) и память (memory). Из всех перечисленных здесь типов только последний (память) довольно труден для освоения. Список условных обозначений возможных типов операндов, взятых из руководства фирмы Intel по процессору Pentium, приведен в табл. 1. Довайте изучим его, поскольку с этого момента мы будем активно пользоваться этими обозначениями при описании синтаксиса команд процессоров Intel.

Таблица 1. Условное обозначение типов операндов.

Один из 8-разрядных регистров общего назначения: АН, AL, BH, BL, CH, CL, DH, DL

Один из 16-разрядных регистров общего назначения: АХ, BX, СХ, DX, SI, DI, SP, BP

Один из 32-разрядных регистров общего назначения: ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, ESP, EBP

Произвольный регистр общего назначения

Один из 16-разрядных сегментных регистров: CS, DS, SS, ES, FS, GS

Непосредственно заданное 8-разрядное значение (байт)

Непосредственно заданное 16-разрядное значение (слово)

Непосредственно заданное 32-разрядное значение (двойное слово)

Непосредственно заданное 8-, 16- или 32-разрядное значение

8-разрядный операнд, в котором закодирован один из 8-разрядных регистров общего назначения или адрес байта в памяти

16-разрядный операнд, в котором закодирован один из 16-разрядных регистров общего назначения или адрес слова в памяти

32-разрядный операнд, в котором закодирован один из 32-разрядных регистров общего назначения или адрес двойного слова в памяти

Адрес 8-, 16- или 32-разрядного операнда в памяти

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

При выполнении этой команды изменяется содержимое операнда-получателя, а содержимое операнда-источника не меняется. Принцип пересылки данных справа налево соответствует принятому в операторах присваивания языков высокого уровня, таких как C ++:

Практически во всех командах ассемблера операнд-получатель находится слева, а операнд-источник— справа.

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

1. Оба операнда должны иметь одинаковую длину.

2. В качестве одного из операндов обязательно должен использоваться регистр (т.е. пересылки типа “память-память” в команде MOV не поддерживаются).

3. В качестве получателя нельзя указывать регистры CS , EIP и IP .

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

Ниже приведены варианты использования команды MOV с разными операндами (кроме сегментных регистров):

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

Пересылка типа “память—память”. С помощью одной команды MOV нельзя напрямую переслать операнд из одной области памяти в другую. Поэтому вначале нужно загрузить исходное значение в один из регистров общего назначения, а затем переслать его в нужное место памяти.

При записи целочисленной константы в переменную или загрузке ее в регистр нужно не забывать про ее минимальную длину в байтах.

6.3. Команда MOVZX.

Команда MOVZX (Move With Zero-Extend, или Переместить и дополнить нулями) копирует содержимое исходного операнда в больший по размеру регистр получателя данных. При этом оставшиеся неопределенными биты регистра-получателя (как правило, старшие 16 или 24 бита) сбрасываются в ноль. Эта команда используется только при работе с беззнаковыми целыми числами. Существует три варианта команды MOVZX:

MOVZX r 16, r / m 8

MOVZX r 32, r / m 8

Условные обозначения операндов этой команды приведены в табл. 1. В каждом из приведенных трех вариантов первый операнд является получателем, а второй — источником данных. В качестве операнда-получателя может быть задан только 16- или 32-разрядный регистр. На рис. 8 показано, как 8-разрядный исходный операнд загружается с помощью команды MOVZX в 16-разрядный регистр.

Рис. 8. Иллюстрация работы команды MOVZX.

В приведенном ниже примере используются все три варианта команды MOVZX с разными размерами операндов.

movzx eax, bx ; EAX = 0000A69Bh

movzx edx, bl ; EDX = 0000009Bh

movzx cx, bl ; CX = 009Bh

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

char byte1 = 0x9B;

short word1 = 0xA69B;

Команда MOVSX ( Move With Sign – Extend , или переместить и дополнить знаком) копирует содержимое исходного операнда в больший по размеру регистр получателя данных, также как и команда MOVZX . При этом оставшиеся неопределенными биты регистра-получателя (как правило, старшие 16 или 24 бита) заполняются значением знакового бита исходного операнда. Эта команда используется только при работе со знаковыми целыми числами. Существует три варианта команды MOVSX :

MOVSX r 16, r / m 8

MOVSX r 32, r / m 8

MOVSX r 32, r / m 16

При загрузке меньшего по размеру операнда в больший по размеру регистр с помощью команды MOVSX , знаковый разряд исходного операнда дублируется (т.е. переносится или расширяется) во все старшие биты регистра-получателя. Например, при загрузке 8-разрядного значения 10001111 b в 16-разрядный регистр, оно будет помещено в младшие 8 битов этого регистра. Затем, как показано на рис. 9, старший бит исходного операнда переносится во все старшие разряды регистра-получателя.

Рис. 9. Иллюстрация работы команды MOVSX.

В приведенном ниже примере используются все три варианта команды MOVSX с разными размерами операндов.

movsx eax, bx ; EAX = FFFFA69Bh

Читайте также:  Монтаж проводки в квартире

movsx edx, bl ; EDX = FFFFFF9Bh

movsx cx, bl ; CX = FF9Bh

Команда LAHF ( Load Status Flags Into АН, или загрузить флаги состояния в регистр АН) позволяет загрузить в регистр АН младший байт регистра флагов EFLAGS . При этом в регистр АН копируются следующие флаги состояния: SF (флаг знака), ZF (флаг нуля), AF (флаг служебного переноса), PF (флаг четности) и CF (флаг переноса). С помощью этой команды можно легко сохранить содержимое регистра флагов в переменной для дальнейшего анализа:

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

В группу команд пересылки данных входит 28 команд, краткое описание которых, а также их количество байт и время выполнения приведено в табл. 1.16.

Таблица 1.16. Команды пересылки данных

Мнемоника командыКод операцииКоличество байтов в командеВремя выполнения команды, циклыВыполняемые действия
MOV A, Rn11101rrr11(A) (Rn)
MOV A, ad1110010121(A) (ad)
MOV A, @Ri1110011i11(A) ((Ri))
MOV A, #d0111010021(A) #d
MOV Rn, A11111rrr11(Rn) (A)
MOV Rn, ad10101rrr22(Rn) (ad)
MOV Rn, #d01111rrr21(Rn) #d
MOV ad, A1111010121(ad) (A)
MOV ad, Rn10001rrr22(ad) (Rn)
MOV add, ads1000010132(add) (ads)
MOV ad, @Ri1000011i22(ad) ((Ri))
MOV ad, #d0111010132(ad) #d
MOV @Ri, A1111011i11((Ri)) (A)
MOV @Ri, ad0110011i22((Ri)) (ad)
MOV @Ri, #d0111011i21((Ri)) #d
MOV DPTR, #d161001000032(DPTR) #d16
MOVC A, @A+DPTR1001001112(А) ((A) +(DPTR))
MOVC A, @A+PC1000001112(PC) (PC)+1, (A) ((A)+(PC))
MOVX A, @Ri1110001i12(A) ((Ri))
MOVX A,@DPTR1110000012(A) ((DPTR))
MOVX @Ri, A1111001i12((Ri)) (A)
MOVX @DPTR,A1111000012((DPTR)) (A)
PUSH ad1100000022(SP) (SP) + 1, ((SP)) (ad)
POP ad1101000022(ad) (SP), (SP) (SP) – 1
XCH A, Rn11001rrr11(A) ↔ (Rn)
XCH A, ad1100010121(A) ↔ (ad)
XCH A, @Ri1100011i11(A) ↔ ((Ri))
XCHD A, @Ri1101011i11(A0…3) ↔((Ri)0…3)

По команде MOV выполняется пересылка данных из второго операнда в первый. Эта команда не имеет доступа ни к внешней памяти данных, ни к памяти программ. Для этих целей предназначены команды MOVX и MOVC соответственно. Первая из них обеспечивает чтение/запись байт из внешней памяти данных, вторая – чтение байт из памяти программ.

По команде XCH выполняется обмен байтами между аккумулятором и ячейкой РПД, а по команде XCHD – обмен младшими тетрадами (битами 0…3).

Команды PUSH и РОР предназначены соответственно для записи данных в стек и их чтения из стека. Размер стека ограничен лишь размером резидентной памяти данных. В процессе инициализации микро-ЭВМ после сигнала сброса или при включении питающего напряжения в SP заносится код 07Н. Это означает, что первый элемент стека будет располагаться в ячейке памяти с адресом 08Н.

Группа команд пересылок МК51 имеет следующую особенность – в ней нет специальных команд для работы со специальными регистрами: PSW, таймером, портами ввода-вывода. Доступ к ним, как и к другим регистрам специальных функций, осуществляется заданием соответствующего прямого адреса, т.е. это команды обычных пересылок, в которых вместо адреса можно ставить название соответствующего регистра. Например, чтение данных из порта Р1 в аккумулятор может быть выполнено командой MOV A, P1.

Кроме того, следует отметить, что в МК51 аккумулятор имеет два различных имени в зависимости от способа адресации: А – при неявной адресации (например, MOV A, R0) и АСС – при использовании прямого адреса. Первый способ предпочтительнее, однако, не всегда применим.

Дата добавления: 2015-09-11 ; просмотров: 560 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

КОМАНДЫ ПЕРЕСЫЛКИ.

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

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

В ней допустимо большинство из возможных сочетаний операндов и различные типы адресаций.

Рассмотрим несколько примеров:

1. Регистровая адресация, когда 16-битовая информация извлекается из регистра источника и помещается в регистр приемник. Команда

копирует содержимое регистра счетчика CX в аккумулятор AX.

2. Непосредственная адресация позволяет указывать 8- или 16-битовое значение константы в качестве регистра источника. Команда

загружает значение 500 в регистр CX, а команда

загружает значение 30 в регистр CL.

Значения для 8-битовых чисел со знаком ограничены диапазоном от 80 до 7F. Для 16 битовых чисел со знаком от 8000 до 7FFF.

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

загружает содержимое ячейки памяти TABLE в регистр AX. На рисунке показана схема исполнения этой команды.

Обратите внимание, что микропроцессор заполняет данные в памяти в обратном порядке. Старший байт слова следует за младшим байтом, а не предшествует ему. Т.е. старшие биты данных располагаются в ячейках памяти со старшими адресами.

4. Косвенная регистровая адресация. При косвенной регистровой адресации исполнительный адрес операнда содержится в базовом регистре BX, регистре указателя базы BP или индексном регистре (SI или DI).Косвенные регистровые операнды надо заключать в квадратные скобки, чтобы отличить их от регистровых команд. Например, команда

загружает в регистр AX содержимое ячейки памяти ,адресуемой значением регистра BX.

Ниже приведено несколько примеров использования команды MOV.

MOV AX,TABLE; Пересылка из памяти в регистр и

MOV TABLE,AX; наоборот(адрес ячейки памяти обознач.меткой)

MOV ES:[BX],AX; Можно заменить используемый регистр сегмента

MOV DS,AX ;Пересылка между 16-битовыми регистрами

MOV BL,AL ;Пересылка между 8-битовыми регистрами

MOV CL,30 ;Пересылка константы в регистр

MOV DEST,25H ;или в память

В команде MOV исключаются следующие сочетания операндов:

1. Нельзя осуществить непосредственную пересылку данных из одной ячейки памяти в другую. Чтобы выполнить такую пересылку, данные из источника надо загрузить в регистр общего назначения, а затем запомнить содержимое этого регистра в приемнике. Например, если POUNDS и WEIGHT -переменные, находящиеся в памяти, то для пересылки значения из одной переменной в другую можно воспользоваться командами

2. Нельзя загружать непосредственно адресуемый операнд в регистр сегмента. Как и в случае 1,сначала надо загрузить его в регистр общего назначения. Например, следующие команды загружают номер блока сегмента данных (DATA_SEG) в регистр DS:

Подобные команды указывают Ассемблеру, где размещен сегмент данных.

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

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

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector