Конспект лекции

доцента кафедры ИВТ Гродненского госуниверситета

канд. техн. наук Ливак Елены Николаевны

 

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

 

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

 

mov <операнд назначения>,<операнд-источник>

 

xchg <операнд1>,<операнд2>

 

Команда mov (MOVe operand)

 

Схема команды: 

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

Назначение:

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


Алгоритм работы:

копирование второго операнда в первый операнд.


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

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

 

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

 

.data

Per1  dw 100       ; 0000 – адрес Per1

Per2  dw 200       ; 0002 – адрес Per2

Per3  dd 10257h    ; 0004 – адрес Per3

 

.code

mov  cx, Per1             ;[cx]= 00 64  (10010=6416)

 

mov  bx, offset Per1      ;[bx] = 00 00  

 

mov  bx, offset Per2      ;[bx]= 00 02

 

mov  ax, bx              ;[ax] = 00 02  [bx] = 00 02

 

mov  cx, Per2               ;[cx] = 00 c8  (20010=c816)

 

mov  ch, 20h               ;[cx] = 20 c8  [сh]= 20 [cl]= c8

                                                         

mov  ax, offset Per2       ;[ax] = 00 02

 

mov  al,5                 ;[ax] = 00 05   [al]= 05 

                                     

mov  ah,10+15             ;[ax] = 19 05   (2510=1916)

 

mov  ax, -1             ;[ax] = FF FF   (-1 = FFFF)

 

 

Примеры ошибок

 

Нельзя    mov  dh, Per1   - constant too large      

Можно     mov dx, Per1

 

Нельзя    mov  dh, 1254h   - constant too large     

Можно     mov dx, 1254h          

                       

Нельзя    mov  ah, Fh     - Undefined symbol  

  (Fh - идентификатор с точки зрения транслятора)

Можно     mov ah, OFh

 

 

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

 

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

 

Нельзя     mov Per1, Per2 - illegal memory reference

       need register in expression

 

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

      Можно

mov ax, Per2

mov Per1, ax

 

Пример

Фрагмент программы для пересылки байта из переменной X в переменную Y будет выглядеть следующим образом:

masm

model   small

.data

x     db      5

y     db      ?

.code

start:

...

        mov     al, x

        mov     y, al

        ...

end     start

 

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

 

Нельзя   mov ds, Perem

 

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

  Это может быть регистр общего назначения или стек

 

Можно    mov ax, Perem

              mov ds, ax

 

Пример

Стандартное начало программы

 

masm

model small

.stack    100h

.data

   <описание данных>

.code

start:

     mov  ax,@data      ;@data - переменная

     mov  ds,ax

          <команды>

     mov  ax,4c00h      ; стандартный выход - ah=00h

     int  21h

end  start

 

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

            (в системе команд нет соответствующей операции)

     Нельзя  mov es, ds

 

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

     mov     ax, ds

     mov     es, ax

 

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

            Нельзя           mov сs, ax

              mov cs, 100

 

Пара  регистров cs:ip всегда содержит адрес команды, которая должна выполняться следующей.

Следовательно, изменение командой mov содержимого регистра cs фактически означает переход к другому сегменту кода, что недопустимо.

 

Совет

Желательно использовать в качестве одного из операндов регистр al/ax/eax.

В этом случае TASM генерирует более быструю форму команды mov.

 

        mov     al,5

        mov     bl,al

 

Команда XCHG     (eXCHanGe - обмен)

 

Команда xchg применяется для двунаправленной пересылки данных.


Назначение:

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

 

 

Схема команды: 

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

 

Алгоритм работы: 

обмен содержимого операнд1 и операнд2.

 

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

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

 

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

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

 

Замечание. В системе команд микропроцессора можно было бы обойтись без этой команды.

Например, для обмена между регистрами ax и bx, можно было бы воспользоваться вспомогательным регистром:

mov dx, ax

mov ax, bx

mov bx, dx

 

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

 

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

  1.  Операнды должны иметь один тип. Нельзя    xchg ax, bl  
  2. Не допускается (как и для всех команд ассемблера) обменивать между собой содержимое двух ячеек памяти. Нельзя xchg Per1, Per2  
2. 

 

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

Необходимо поменять порядок следования байт в слове

 

ch1     label   byte

        dw      0f85ch       ;[ch1]=5c, [chl+1]=f8

 

...

        mov     al,ch1       ;al = 5c

        xchg    ch1+1,al          ;al = f8, [chl+1]=5c

        mov     ch1,al       ;[ch1]=f8