Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
BTS
Влияние команды на флаги и форматы команды:
? |
? |
? |
? |
? |
* |
0F AB |
BTS r/m16,r16 |
Выбрать по r16 бит из r/m16 в CF установить этот бит |
Intel386 |
bts [di],bp |
0F AB |
BTS r/m32,r32 |
Выбрать по r32 бит из r/m32 в CF установить этот бит |
Intel386 |
bts [edi],ebx |
0F BA /5 ib |
BTS r/m16,imm8 |
Выбрать по imm8 бит из r/m16 в CF установить этот бит |
Intel386 |
bts [bx+si],05 |
0F BA /5 ib |
BTS r/m32,imm8 |
Выбрать по imm8 бит из r/m32 в CF установить этот бит |
Intel386 |
bts [edi+ebx],02 |
Описание:
Команда BTS сохраняет значение бита, из первого операнда со смещением, указанным вторым операндом, во флаге CF, а затем устанавливает этот бит в 1.
Значение индекса выбираемого бита может быть представлено постоянным непосредственным значением в команде BTS или значением в общем регистре. В этой команде используется только 8-битное непосредственное значение. Значение этого операнда берется по модулю 32, таким образом смещение битов находится в диапазоне от 0 до 31. Это позволяет выбирать любой бит внутри регистра. Для битовых строк в памяти это поле непосредственного значения дает только смещение внутри слова или двойного слова.
Некоторые ассемблеры поддерживают значения битовых смещений больше 31, используя поле непосредственного значения imm8 в комбинации с полем смещения операнда в памяти disp. В этом случае ассемблером младшие 3 или 5 битов (3 для 16-битных операндов, 5 для 32-битных операндов) смещения бита (второй операнд команды) сохраняются в поле непосредственного операнда, а старшие биты сдвигаются и комбинируются с полем смещения. Процессор же игнорирует ненулевые значения старших битов поля imm8.
При доступе к памяти процессор обращается к четырем байтам, начинающимся по полученному следующим образом адресу:
Effective Address + (4 * (BitOffset DIV 32))
для размера операнда 32 бита, или к двум байтам, начинающимся по адресу:
Effective Address + (2 * (BitOffset DIV 16))
для 16-битного размера операнда. Такое обращение происходит, даже если необходим доступ только к одиночному байту. Поэтому, избегайте ссылок к областям памяти, близким к пустым адресным пространствам. В частности, избегайте ссылок на распределенные в памяти регистры ввода-вывода. Вместо этого используйте команду MOV для загрузки и сохранения значений по таким адресам и регистровую форму команды BTS для работы с данными.
Операция:
CF = BIT[LeftSRC, RightSRC];
BIT[LeftSRC, RightSRC] = 1;
Особые ситуации защищенного режима:
#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