Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
MOVS
Влияние команды на флаги и форматы команды:
|
|
|
|
|
|
|
|
|
A4 |
MOVS m8,m8 |
Записать в ячейку по адресу ES:(E)DI байт из ячейки с адресом DS:(E)SI |
8086 |
movsb |
A5 |
MOVS m16,m16 |
Записать в ячейку по адресу ES:(E)DI слово из ячейки с адресом DS:(E)SI |
8086 |
movsw |
A5 |
MOVS m32,m32 |
Записать в ячейку по адресу ES:(E)DI двойное слово из ячейки с адресом DS:(E)SI |
Intel386 |
movsd |
A4 |
MOVSB |
Записать в ячейку по адресу ES:(E)DI байт из ячейки с адресом DS:(E)SI |
8086 |
movsb |
A5 |
MOVSW |
Записать в ячейку по адресу ES:(E)DI слово из ячейки с адресом DS:(E)SI |
8086 |
movsw |
A5 |
MOVSD |
Записать в ячейку по адресу ES:(E)DI двойное слово из ячейки с адресом DS:(E)SI |
Intel386 |
movsd |
Описание:
Команда MOVS копирует байт, слово или двойное слово по адресу DS:(E)SI в байт слово или двойное слово по адресу ES:(E)DI. Операнд-назначение всегда адресуется с помощью регистра ES, замещение сегмента для назначения невозможно. Замещение сегмента может быть использовано для операнда-источника (сегментом по умолчанию является DS).
Адреса источника и назначения определяются исключительно через значения индексных регистров (E)SI, (E)DI. Регистры SI и DI используются при 16-битном атрибуте размера адреса, а ESI и EDI — при 32-битном атрибуте размера адреса. Атрибут размера операнда определяет пересылку слова (16-битный атрибут) или двойного слова (32-битный атрибут) командами MOVSW и MOVSD, код операции для которых одинаков.
Мнемоники MOVSB, MOVSW и MOVSD являются синонимами мнемоники MOVS, использующей однобайтные, двухбайтные и четырехбайтные операнды соответственно.
После пересылки данных оба регистра, (E)SI и (E)DI автоматически изменяются. Если флаг DF равен 0 (была выполнена команда CLD), то регистры увеличиваются, если флаг DF равен 1 (была выполнена команда STD), то регистры уменьшаются. Увеличение или уменьшение происходит на 1, если пересылается байт, на 2, если пересылается слово, на 4, если пересылается двойное слово.
Команде MOVS может предшествовать префикс REP для перемещения блоков из (E)CX байт, слов или двойных слов.
Операция:
IF (Команда MOVSD) OR (Команда, работающая с двойными словами)
THEN OperandSize = 32;
ELSE OperandSize = 16;
FI;
IF AddressSize = 16
THEN Использовать SI для source-index и DI для destination-index;
ELSE (* AddressSize = 32 *)
Использовать ESI для source-index и EDI для destination-index;
FI;
IF (Команда байтового типа)
THEN
[destination-index] = [source-index]; (* Перенос байта *)
IF DF = 0 THEN IncDec = 1 ELSE IncDec = -1; FI;
ELSE
IF OperandSize = 16
THEN
[destination-index] = [source-index]; (* Перенос слова *)
IF DF = 0 THEN IncDec = 2 ELSE IncDec = -2; FI;
ELSE (* OperandSize = 32 *)
[destination-index] = [source-index]; (* Перенос двойного слова *)
IF DF = 0 THEN IncDec = 4 ELSE IncDec = -4; FI;
FI;
FI;
source-index = source-index + IncDec;
destination-index = destination-index + IncDec;
Особые ситуации защищенного режима:
#GP(0), если результат находится в сегменте, запрещенном для записи, если используется некорректный эффективный адрес операнда в памяти в сегментах CS, DS, ES, FS, GS или нулевой селектор.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память при текущем уровне привилегий равном 3.
Особые ситуации режима реальной адресации:
#GP, если любая часть операнда находится вне пространства эффективных адресов в сегментах CS, DS, ES, FS или GS.
#SS, если любая часть операнда находится вне пространства эффективных адресов в сегменте SS.
Особые ситуации режима V86:
Такие же, как и в режиме реальной адресации.
#PF(Код ошибки) при страничной ошибке.
#AC(0) при невыровненной ссылке в память.
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru