logo

Главная Система команд x86 Базовая система команд CPU SBB

Система команд x86

Программирование - Архитектура и система команд микропроцессоров x86
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

SBB

Целочисленное вычитание с заемом

Влияние команды на флаги и форматы команды:

OF

DF

IF

TF

SF

ZF

AF

PF

CF

*

 

 

 

*

*

*

*

*

 

Код

Команда

Описание

Проц.

Пример

1C ib

SBB AL,imm8

AL = AL - imm8 - CF

8086

sbb al,0AAh

1D iw

SBB AX,imm16

AX = AX - imm16 - CF

8086

sbb ax,0FODh

1D id

SBB EAX,imm32

AX = AX - imm32 - CF

Intel386

sbb eax,23456789h

80 /3 ib

SBB r/m8,imm8

r/m8 = r/m8 - imm8 - CF

8086

sbb ah,5

81 /3 iw

SBB r/m16,imm16

r/m16 = r/m16 - imm16 - CF

8086

sbb dx,0DBBh

81 /3 id

SBB r/m32,imm32

r/m32 = r/m32 - imm32 - CF

Intel386

sbb edx,0CAAAAh

83 /3 ib

SBB r/m16,imm8

r/m16 = r/m16 - imm8 - CF

8086

sbb cx,0AAh

83 /3 ib

SBB r/m32,imm8

r/m32 = r/m32 - imm8 - CF

Intel386

sbb ecx,02h

18 /r

SBB r/m8,r8

r/m8 = r/m8 - r8 - CF

8086

sbb [di],ah

19 /r

SBB r/m16,r16

r/m16 = r/m16 - r16 - CF

8086

sbb bx,si

19 /r

SBB r/m32,r32

r/m32 = r/m32 - r32 - CF

Intel386

sbb memory,eax

1A /r

SBB r8,r/m8

r8 = r8 - r/m8 - CF

8086

sbb dl,sum

1B /r

SBB r16,r/m16

r16 = r16 - r/m16 - CF

8086

sbb di,[si+12]

1B /r

SBB r32,r/m32

r32 = r32 - r/m32 - CF

Intel386

sbb ecx,raznost

Описание:

Команда SBB (Integer Subtraction with Borrow) относится к группе команд целочисленной (или двоичной) арифметики (Binary Arithmetic Instructions) и производит целочисленное вычитание, вычитая из первого операнда (DEST) второй операнд (SRC) и флаг переноса EFLAGS.CF (операнды могут быть знаковыми или беззнаковыми). Первый операнд (операнд-назначение, DEST) может быть переменной в регистре или в памяти (r8, r16, r32, r/m8, r/m16, r/m32). Второй операнд (операнд-источник, SRC) — непосредственным значением (imm8, imm16, imm32), переменной в регистре или в памяти. При этом оба операнда одновременно не могут быть переменными в памяти.

Результат вычитания командой SBB помещается на место первого операнда (DEST). Флаги в регистре EFLAGS устанавливаются в соответствии с полученным результатом.

При вычитании непосредственного значения imm8 или imm16 из двухбайтного или четырехбайтного операнда-источника непосредственная величина прежде всего знакорасширяется до размера первого операнда, и только после этого выполняется вычитание.

Команда SBB обычно используется в многобайтных или многословных (multi-word) операциях вычитания. В таком случае она идет вслед за командой SUB, которая возвращает разность младших разрядов многобайтных (многословных) операндов, позволяя при вычитании старших разрядов учитывать перенос (заем). Например:

mov edx, 0             ; EDX = 0
mov eax, 000000001h    ; первый 32-битный операнд (уменьшаемое) помещаем в EAX
sub eax, 0FFFFFFFFh    ; второй 32-битный операнд (вычитаемое), производим вычитание двух 32-битных операндов
sbb edx, 0             ; EDX = EDX - CF, учитываем заем
                       ; EDX:EAX = FFFFFFFFh:000000002h - полученный 64-битный результат

Команда SBB позволяет манипулировать целочисленными операндами как в беззнаковом формате, так и в формате со знаком. При вычитании данных со знаком флаг знака EFLAGS.SF будет отражать знак полученного результата. Флаг переполнения EFLAGS.OF установится в 1, если при вычитании целочисленных значений со знаком, представленных в обратном коде или в дополнительном коде, произошло переполнение (заем в старший значащий разряд, которому соответствует бит, предшествующий разряду знака), то есть полученный результат превышает доступный размер операнда-назначения (DEST). По сути, это аналогично тому, как флаг EFLAGS.CF отражает переполнение (заем) при вычитании беззнаковых операндов. Например, при вычитании двух 32-битных значений, представленных в обратном коде, это может выглядеть следующим образом:

mov eax, operand1      ; EAX = operand1, первый 32-битный операнд (уменьшаемое) помещаем в EAX
sub eax, operand2      ; производим вычитание двух 32-битных операндов в обратном коде
into                   ; переход к обработчику прерывания в случае переполнения

sbb eax, 0             ; EAX = EAX - CF, учитываем заем (необходимо для вычитания в обратном коде)
                       ; EAX = operand1 - operand2 - результат вычитания в обратном коде
jns m1                 ; переход, если результат положительный
not eax
bts eax, 31            ; преобразование отрицательного значения в EAX к прямому коду
m1:                    ; EAX - результат вычитания в прямом коде

Флаг вспомогательного (или дополнительного) переноса EFLAGS.AF помогает манипулировать данными в двоично-десятичном формате (упакованный BCD-формат). Он устанавливается, если при вычитании возникает заем в младшую тетраду из старшей тетрады младшего байта результата. Используя команду DAS сразу же вслед за командой SBB, можно произвести так называемую десятичную коррекцию результата вычитания и получить разность в таком же упакованном BCD-формате, как и исходные операнды.

Команда SBB с операндом-назначением (DEST), являющимся переменной в памяти, может использоваться совместно с префиксом блокировки LOCK, который обеспечит атомарное исполнение команды.

Операция:

IF (разрядность SRC меньше разрядности DEST)

   THEN DEST = DEST - (SignExtended(SRC) + CF);

   ELSE DEST = DEST - (SRC + CF);

FI;

Особые ситуации защищенного режима:

#GP(0), если операнд-назначение (DEST) находится в памяти в сегменте, запрещенном для записи.
#GP(0), если при обращении к операнду в памяти в сегменте DS, ES, FS или GS используется нулевой селектор.
#GP(0), если любая часть операнда в памяти находится вне допустимого пространства эффективных адресов в сегменте CS, DS, ES, FS или GS.
#SS(0), если любая часть операнда в памяти находится вне допустимого пространства эффективных адресов в стековом сегменте SS.

Intel386 … :
#PF(Код ошибки) при страничной ошибке.
#UD при использовании префикса LOCK, если первый операнд команды (DEST) не является значением в памяти.

Intel486 … :
#AC(0) при невыровненной ссылке в память, если активирован контроль выравнивания (CR0.AM = 1, EFLAGS.AC = 1, CPL = 3).

Особые ситуации режима реальной адресации:

#GP, если любая часть операнда в памяти находится вне допустимого для реального режима пространства эффективных адресов в сегменте CS, DS, ES, FS или GS.
#SS, если любая часть операнда в памяти выходит за допустимую для реального режима верхнюю границу стекового сегмента SS.

Intel386 … :
#UD при использовании префикса LOCK, если первый операнд команды (DEST) не является значением в памяти.

Особые ситуации режима V86:

#GP(0), если любая часть операнда в памяти находится вне допустимого пространства эффективных адресов в сегменте CS, DS, ES, FS или GS.
#SS(0), если любая часть операнда в памяти находится вне допустимого пространства эффективных адресов в стековом сегменте SS.

Intel386 … :
#PF(Код ошибки) при страничной ошибке.
#UD при использовании префикса LOCK, если первый операнд команды (DEST) не является значением в памяти.

Intel486 … :
#AC(0) при невыровненной ссылке в память, если активирован контроль выравнивания (CR0.AM = 1, EFLAGS.AC = 1, CPL = 3).

Замечание:

К командам целочисленной арифметики относятся команды ADD, ADC, SUB, SBB, IMUL, MUL, IDIV, DIV, INC, DEC, NEGCMP.

В свою очередь, сами названные команды целочисленной арифметики делятся на следующие подгруппы:

  • команды сложения (ADDADCINC);
  • команды вычитания (SUB, SBB, DEC);
  • команды умножения (IMUL, MUL);
  • команды деления (IDIV, DIV).
  • команды сравнения и изменения знака (CMP, NEG).

Входит в группу команд: Базовая система команд CPU




Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru

Top.Mail.Ru       Сервер радиолюбителей России - схемы, документация,

 соревнования, дипломы, программы, форумы и многое другое!   схемы новости электроники