S
SBB Целочисленное вычитание с займом
Команда sbb вычитает второй операнд (источник) из первого (приемника). Результат замещает первый операнд, предыдущее значение которого теряется. Если установлен флаг CF, из результата вычитается еще 1. Таким образом, если команду вычитания записать в общем виде:
sbb операнд__1, операнд_2
То ее действие можно условно изобразить следующим образом:
операнд_1 – операнд_2 – CF › операнд_1
В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго – регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда sbb обычно используется для вычитания 32-разрядных чисел. Команда воздействует на флаги OF, SF, ZF, PF и CF.
Пример 1:
mov AX,76A5h sbb AX,76A3h; AX=1, если CF был = 1 ;AX=2, если CF был = 0
Пример 2:
; В полях данных: numlow dw 000Ah; Младшая часть вычитаемого numhigh dw 0001h; Старшая часть вычитаемого ;Число 1000Ah=65546 ;В программном сегменте: mov AX, 0; Младшая часть уменьшаемого mov DX,0002; Старшая часть уменьшаемого ;Число 20000h=131072 sub AX, numlow; Вычитание младших частей. ;AX=FFF6h, CF=1 sbb DX,numhigh; Вычитание старших частей с займом. ;DX:AX=0000:FFF6h=65526
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.
Пример:
;В полях данных: nlow dd 0Ch; Младшая часть вычитаемого nhi dd 40000000h; Старшая часть вычитаемого ;Число 400000000000000Ch; В программном сегменте: mov EAX,0Bh; Младшая часть уменьшаемого mov EBX,60000000h; Старшая часть уменьшаемого ;Число 600000000000000Bh sub EAX,nlow; Вычитание младших частей. ;EAX=FFFFFFFFh, CF=1 sbb EBX,nhi; Вычитание старших частей с ;займом. EBX=lFFFFFFFh ;Разность IFFFFFFFFFFFFFFFh