Команды передачи данных

Группу команд передачи данных можно условно разделить на четыре части: общие, ввода/вывода, адресные и флагов. Эти команды представлены в таблице 3.1.

Таблица 3.1.

Команды передачи данных.

Мнемокод/Операнды Краткое описание команды  
Общие команды:  
MOV назначение, источник Переслать (скопировать) байт или слово  
XCHG назначение, источник Перестановка байтов или слов  
POP назначение Извлечение слова из стека  
PUSH источник Занесение слова в стек  
XLAT/XLATB таблица Перекодировка таблицы  
Команды ввода/вывода:  
IN сумматор, порт Выборка байта или слова из порта
OUT порт, сумматор Размещение байта или слова в порт
Адресные команды:  
LDS назначение, источник Загрузка регистра сегмента данных  
LEA назначение, источник Загрузка эффективного адреса  
LES назначение, источник Загрузка регистра дополнительного сегмента  
Команды работы с регистром флагов:  
LAHF Загрузка флагов в регистр AH  
SAHF Установка флагов из регистра AH  
POPF Извлечение регистра флагов из стека  
PUSHF Занесение регистра флагов в стек  

Рассмотрим некоторые из них.

Команда пересылки данных MOV (move data) –на место первого операнда пересылается значение второго операнда, флаги не меняет:

MOV dst, src

где dst – оператор получатель, src – операнд отправитель.

Допустимые комбинации операндов:

dst src
r8 i8, r8, m8
m8 i8, r8
r16 i16, r16, sr, m16
sr (кроме CS) i16, m16
m16 i16, r16, sr

Команда обмена данными XCHG (exchange) – меняет местами значения своих операндов (они должны быть либо байтами, либо словами), флаги не меняются:

XCHG dst, src

Допустимые типы операндов команды XCHG:

dst src размер операндов
r8 r8, m8 перестановка байтов
m8 r8
r16 r16, m16 перестановка слов
m16 r16

Examle 3.4.Фрагмент программы использования команды XCHG.

; описание данных

count db 10h, 20h

total dw 1234h

var16 dw ?

; фрагмент кода программы

XCHG AX, total ;

XCHG AX, BX ;

XCHG DL, AL ;

XCHG count, AL ;

XCHG var16, AX ;

Команда PUSH (PUSHed) - включает в стек слово операнда, a команда POP (POPed) - извлекает слово из стека.

PUSH src.

POP dst

В командах PUSH и POP допустимы следующие операнды:

dst - r16, m16, sr (кроме CS) src - r16, m16, sr

Examle 3.5.Фрагмент программы использования команд PUSH и POP.

; описание данных

var16 dw 1234h

; фрагмент кода программы

PUSH BX ;

PUSH var16 ;

POP BX ;

POP var16 ;

; доступ к элементам стека

MOV BP, SP ;

MOV AX, [BP] ;

Команда преобразования XLAT применяется для быстрого преобразования символов из одного кода в другой. Она заменяет содержимое аккумулятора AL на байт из 256-байтовой таблицы, начальный адрес которой находится в регистре BX, а восьмибитовое смещение - в регистре AL. В качестве сегментного используется регистр DS. Некоторые ассемблеры допускают мнемонику XLATB, подчеркивающую, что команда преобразует байты.

XLAT [table]

XLATB [table]

где [table] – необязательный параметр, представляющий собой символическое имя начального адреса таблицы преобразования.

На рисунке 3.1. показан механизм работы команды перекодировки таблиц XLAT.

Examle 3.6.Фрагмент программы использования команды XLAT.

; Преобразование чисел от 0 до 15 в 16-ое число

; описание данных

tablehex db ‘0123456789ABCDEF’ ; Таблица для преобразования

; фрагмент кода программы

MOV BX, OFFSET tablehex ; В BX поместить смещение tablehex

MOV AL, 10 ; В AL поместить число для преобразования

XLAT ; Преобразовать число в 16-ое число

Команда LEA извлекает из памяти 16-битовый адрес и помещает его в один из общих регистров. Практически эта команда дублирует один из вариантов команды MOV, но выполняется быстрее.

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

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

LEA reg, mem

LDS reg, mem

LES reg, mem

Examle 3.7.Фрагмент программы использования команд LES, LDS и LEA.

; описание данных

str_1 DB ‘Hello’ ; str_1 содержит смещение строки ‘Hello’

str_2 DB 50 DUP (‘ ‘) ;

str_pnt DD str_1 ; str_pnt содержит полный указатель переменной str_1

; фрагмент кода программы

LEA SI, str_1 ;

LEA DI, str_2 ;

MOV AL, [SI] ;

MOV [DI], AL ;

LES BX, str_pnt ;

LDS BX, str_pnt ;