Конспект лекции
доцента кафедры ИВТ Гродненского госуниверситета
канд. техн. наук Ливак Елены Николаевны
Команды пересылки данных
К основным командам пересылки данных относятся следующие команды:
mov <операнд назначения>,<операнд-источник>
xchg <операнд1>,<операнд2>
Схема команды:
mov приемник, источник
Назначение:
пересылка данных между регистрами или регистрами и памятью.
Алгоритм работы:
копирование второго операнда в первый операнд.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги
.data
Per1 dw 100 ; 0000 – адрес Per1
Per2 dw 200 ; 0002 – адрес Per2
Per3 dd 10257h ; 0004 – адрес Per3
…
mov cx, Per1 ;[cx]= 00 64 (10010=6416)
mov bx, offset Per1 ;[bx] = 00 00
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.
Необходимо поменять порядок следования байт в слове
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