Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
LODSW
Влияние команды на флаги и форматы команды:
|
|
|
|
|
|
|
|
|
AC |
LODS m8 |
Считать байт по адресу DS:(E)SI в AL |
8086 |
lodsb |
AD |
LODS m16 |
Считать слово по адресу DS:(E)SI в AX |
8086 |
lodsw |
AD |
LODS m32 |
Считать двойное слово по адресу DS:(E)SI в EAX |
Intel386 |
lodsd |
AC |
LODSB |
Считать байт по адресу DS:(E)SI в AL |
8086 |
lodsb |
AD |
LODSW |
Считать байт по адресу DS:(E)SI в AX |
8086 |
lodsw |
AD |
LODSD |
Считать байт по адресу DS:(E)SI в EAX |
Intel386 |
lodsd |
Описание:
Мнемоники LODSB, LODSW и LODSD — синонимы команды LODS для байта, слова и двойного слова.
Команда LODS загружает в регистр AL, AX или EAX байт, слово или двойное слово из ячейки памяти, указываемой при помощи индексного регистра-источника. После загрузки индексный регистр-источник автоматически изменяется. Если флаг DF равен 0 (была выполнена команда CLD), то индекс-источник увеличивается, если флаг DF равен 1 (была выполнена команда STD), то индекс-источник уменьшается. Увеличение или уменьшение происходит на 1, если загружается байт, на 2, если загружается слово, на 4, если загружается двойное слово.
Если атрибут размера адреса команды равен 16 бит, то для индексного регистра-источника используется регистр SI, иначе, если атрибут размера адреса команды равен 32 бита, то для индексного регистра источника используется регистр ESI. Индекс источника однозначно определяется содержимым регистра SI или ESI. В качестве сегментного регистра по умолчанию используется регистр DS, но он может быть переопределен с помощю префикса замещения сегмента.
Команде LODS может предшествовать префикс REP, тем не менее, более типично использование команды LODS внутри LOOP-конструкций, потому что обычно необходима дальнейшая обработка данных в регистрах AL, AX или EAX.
Операция:
IF AddressSize = 16
THEN Использовать SI для sourse-index;
ELSE (* AddressSise = 32 *) Использовать ESI для sourse-index;
FI;
IF (Команда байтового типа)
THEN
AL = [sourse-index]; (* загрузить байт *)
IF DF = 0 THEN IncDec = 1; ELSE IndDec = -1; FI;
ELSE
IF OperandSize = 16
THEN
AX = [sourse-index]; (* Загрузить слово *)
IF DF = 0 THEN IncDec = 2; ELSE IndDec = -2; FI;
ELSE (* OperandSize = 32 *)
EAX = [sourse-index]; (* Загрузить двойное слово *)
IF DF = 0 THEN IncDec = 4; ELSE IndDec = -4; FI;
FI;
FI;
sourse-index = sourse-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