Команды передачи данных
Группу команд передачи данных можно условно разделить на четыре части: общие, ввода/вывода, адресные и флагов. Эти команды представлены в таблице 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 ;