Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
PAVGB
Влияние команды на флаги и форматы команды:
|
|
|
|
|
|
0F E0 /r |
PAVGB mm1,mm2/m64 |
Найти средние для упакованных беззнаковых байтов из mm1, mm2/m64 и поместить в mm1 |
Pentium III |
pavgb mm2,mm3 |
0F E3 /r |
PAVGW mm1,xmm2/m64 |
Найти средние для упакованных беззнаковых слов из mm1, mm2/m64 и поместить в mm1 |
Pentium III |
pavgw mm4,[ebx] |
Описание:
Команда PAVG прибавляет беззнаковые целые элементы, упакованные в операнде-источнике, к соответствующим элементам операнда-назначения. Причем формирование итоговых значений происходит следующим образом: полное значение суммы с переносом сдвигается на одну позицию вправо, при этом перенос попадает в старший бит сохраняемого значения, а его младший бит выдвигается и теряется (например, 255 + 255 = 255, 254 + 255 = 255, 253 + 255 = 254, 2 + 3 = 5).
Возможно сложение упакованных беззнаковых байтов (PAVGB) и слов (PAVGW). Операндом-источником команды могут быть MMX-регистры и операнды в памяти, а операндом-назначением только MMX-регистры.
Операция:
IF (Команда PAVGB) THEN
X[0] = DEST[7-0];
Y[0] = SRC/m64[7-0];
X[1] = DEST[15-8];
Y[1] = SRC/m64[15-8];
X[2] = DEST[23-16];
Y[2] = SRC/m64[23-16];
X[3] = DEST[31-24];
Y[3] = SRC/m64[31-24];
X[4] = DEST[39-32];
Y[4] = SRC/m64[39-32];
X[5] = DEST[47-40];
Y[5] = SRC/m64[47-40];
X[6] = DEST[55-48];
Y[6] = SRC/m64[55-48];
X[7] = DEST[63-56];
Y[7] = SRC/m64[63-56];
DO WHILE (I < 8)
TEMP[I] = ZERO_EXT(X[I], 8) + ZERO_EXT{Y[I], 8);
RES[I] = (TEMP[I] + 1) >> 1;
OD;
DEST[7-0] = RES[0];
DEST[15-8] = RES[1];
DEST[23-16] = RES[2];
DEST[31-24] = RES[3];
DEST[39-32] = RES[4];
DEST[47-40] = RES[5];
DEST[55-48] = RES[6];
DEST[63-56] = RES[7];
ELSE (* Команда PAVGW *)
X[0] = DEST[15-0];
Y[0] = SRC/m64[15-0];
X[1] = DEST[31-16];
Y[1] = SRC/m64[31-16];
X[2] = DEST[47-32];
Y[2] = SRC/m64[47-32];
X[3] = DEST[63-48];
Y[3] = SRC/m64[63-48];
DO WHILE (I < 4)
TEMP[I] = ZERO_EXT(X[I], 16) + ZERO_EXT{Y[I], 16);
RES[I] = (TEMP[I] + 1) >> 1;
OD;
DEST[15-0] = RES[0];
DEST[31-16] = RES[1];
DEST[47-32] = RES[2];
DEST[63-48] = RES[3];
FI;
Особые ситуации защищенного режима:
#GP(0) при некорретном эффективном адресе операнда в памяти в сегментах CS, DS, ES, FS или GS.
#SS(0) при использовании некорректного эффективного адреса в сегменте SS.
#PF(Код ошибки) при страничной ошибке.
#NM, если CR0.TS = 1.
#AC при невыровненных обращениях к памяти (когда CR0.AM = 1, EFLAGS.AC = 1 и CPL = 3).
#UD, если CR0.EM = 1.
#MF, если есть отложенные необработанные незамаскированные исключения FPU.
Особые ситуации режима реальной адресации:
#GP, если любая часть операнда находится вне пространства эффективных адресов от 0 до 0FFFFh.
#NM, если CR0.TS = 1.
#UD, если CR0.EM = 1.
#MF, если есть отложенные необработанные незамаскированные исключения FPU.
Особые ситуации режима V86:
Такие же, как и в режиме реальной адресации.
#PF(Код ошибки) при страничной ошибке.
#AC при невыровненных обращениях к памяти (когда CR0.AM = 1 и EFLAGS.AC = 1).
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru