Синтаксис | SUB приемник,источник |
Машинный код | 2C ib — SUB AL,imm8 2D iw — SUB AX,imm16 2D id — SUB EAX,imm32 80 /5 ib — SUB r/m8,imm8 81 /5 iw — SUB r/m16,imm16 81 /5 id — SUB r/m32,imm32 83 /5 ib — SUB r/m16,imm8 83 /5 ib — SUB r/m32,imm8 28 /r — SUB r/m8,r8 29 /r — SUB r/m16,r16 29 /r — SUB r/m32,r32 2A /r — SUB r8,r/m8 2B /r — SUB r16,r/m16 2B /r — SUB r32,r/m32 |
Описание | Вычитание. |
Действие | Вычитание двух целочисленных двоичных операндов. приёмник = приёмник — источник |
Флаги | OF=r SF=r ZF=r AF=r PF=r CF=r |
Команда SUB вычитает из первого операнда (приёмника) второй операнд. Результат вычитания переписывает значение операнда — приёмника.
Флаг SF имеет значение только для чисел со знаком. SF=1 указывает на отрицательный знак результата. Пример:
1 2 3 | mov ah,100 mov al,127 sub ah,al ; AH = 0xE5 = -27, SF=1 |
Если числа равноразмерные и без знака, то CF=1 будет указывать на некорректный результат (результат ушел в отрицательное значение). Например:
1 2 3 | mov ah,250 mov al,251 sub ah,al ;AH = 0xFF = -1 (число со знаком) и 0xFF = 255 (число без знака). Т.е. результат некорректный |
Для чисел со знаком и при вычитании меньшего по размеру числа от большего (пример, вычитание слова от двойного слова) CF=1 означает, что вычитание выполнилось с заёмом. Инструкция SBB продолжит вычитание с учетом флага CF:
1 2 3 4 5 6 7 8 | mov ax,0x37DD ; Старшая часть уменьшаемого числа mov bx,0x0077 ; Младшая часть уменьшаемого числа mov dx,0x3DDE ; Вычитаемое число sub bx,dx ; Сперва вычитаем от младшей части ; BX = BX - DX = 0xC299. SF=1, CF=1 sbb ax,0 ; Затем вычитаем от старшей части с учетом CF ; AX = AX - 1 = 0x37DC |