ADC Целочисленное сложение с переносом
Команда adc осуществляет сложение первого и второго операндов, прибаатяя к результату значение флага переноса CF. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда команды adc можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда adc (совместно с командой add) обычно используется для сложения 32-разрядных чисел. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.
Пример 1
mov AX,1125hadc AX,2C25h ;AX=3D4Bh, если CF был = 1
;AX=3D4Ah, если CF был = 0
Пример 2
; В полях данных:
numlow dw 0FFFFh ;Младшая часть 2-го слагаемого
numhigh dw 000Sh ;Старшая часть 2-го слагаемого
;Число 0005FFFFh=393215
;В программном сегменте:
mov AX,000Sh ;Младшая часть 1-го слагаемого
mov BX,0002h ;Старшая часть 1-го слагаемого
;Число 00020005h=131077
add АХ,numlow ;Сложение младших частей. АХ=4, CF=1
adc BX, numhigh ;Сложение старших частей с
;переносом.ВХ:АХ=0008:0004h.
;Число 00080004h=524292
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Команда adc с 32-разрядными операндами может использоваться для сложения 64-разрядных целых чисел.
; В полях данныхПример
mem321 dd 0FFFFFFFFh ;Младшая часть 1-го слагаемого
mem32h dd 98765432h ;Старшая часть 1-го слагаемого
; В программном сегменте
mov EAX,1 ;Младшая часть 2-го слагаемого
mov EBX,0 ;Старшая часть 2-го слагаемого
add EAX,mem321 ;Складываем младшие половины
;Сумма=100000000Ь>32 бит
;EAX=000000h, перенос
adc EBX,mem32h ;Складываем старшие половины
;и перенос. EBX=90000001h ;Сумма: 9876543300000000h
ADD Целочисленное сложение
Команда add осуществляет сложение первого и второго операндов. Исходное значение
первого операнда (приемника) теряется, замещаясь результатом сложения. Второй
операнд не изменяется. В качестве первого операнда команды add можно указывать
регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр
(кроме сегментного), ячей-ку памяти или непосредственное значение, однако не
допускается опре-делять оба операнда одновременно как ячейки памяти. Операнды
могут быть байтами или словами и представлять числа со знаком или без знака.
Команду add можно использовать для сложения как обычных целых чи-сел, так и
двоично-десятичных (с использованием регистра АХ для хра-нения результата).
Если складываются неупакованные двоично- десятич-ные
(BCD) числа, после команды
add следует использовать команду ааа; если складываются упакованные числа, то
команду daa. Команда воздействует на флаги OF,
SF, ZF, AF, PF и CF.
Пример 1
mov BX,lFFEhmov CX,3
add BX,CX ;BX=2001h, CX=0003h
Пример 2
mov AX,25h
add AX,12h ;AX=0037h
Пример 3
; В полях данных:
mem dw 128
;B программном сегменте:
add mem,100 ;mem=228
Пример 4
mov AX,0507h ;BCD распакованное 57
add AL,05h ;BCD 5, AX=050Ch
aaa ;AX=0602h, BCD 62
Пример 5
mov AL,57h ;BCD упакованное 57
add AL,05h ;BCD 5, AL=5Ch
daa ;AL=62h, BCD 62
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.
Пример
mov EAX,98765432h
add EAX,11111111h ; EAX=A9876543h
AND Логическое И
Команда and осуществляет логическое (побитовое) умножение первого операнда на
второй. Исходное значение первого операнда (приемника) теряется, замещаясь результатом
умножения. В качестве первого операнда команды and можно указывать регистр (кроме
сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного),
ячейку памяти или непосредственное значение, однако не допускается определять
оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или
словами. Команда воздействует на флаги SF, ZF и
PF.
Правила побитового умножения:
Первый операнд-бит 0101
Второй операнд-бит 0011
Бит результата 0001
Пример 1
mov AX,0FFEh
and AX,5555h ;AX=0554h
Пример 2
; В полях данных:
mem dw 0С003h
;В программном сегменте:
mov AX,700Eh
and AX,mem ;AX=4002h
Допустимо использование 32-битовых операндов и дополнительных режимов
адресации 32-разрядных процессоров.
Пример
mov EDX, 0FA8 8 0 0 4 lh
and EDX,0FF00000Fh ; EDX = FA000001h
386P+
ARPL
Коррекция запрашиваемого уровня привилегий селектора
Команда aprl сравнивает селектор с образцом, содержащим максимально допустимый
уровень привилегий (обычно используется селектор
CS) и устанавливает проверяемое
значение в соответствии с меньшим из двух уровней привилегий. Если изменение
уровня не потребовалось, флаг ZF сбрасывается, если потребовалось - устанавливается.
В качестве первого операнда команды aprl может использоваться 16-разрядный регистр
или слово памяти с проверяемым селектором; в качестве второго операнда - 16-разрядный
регистр с селектором-образцом.
386+
BOUND
Проверка индекса массива на выход за границы массива
Команда bound проверяет, лежит ли указанный индекс, рассматриваемый, как число
со знаком, внутри заданных вторым операндом границ.
Если индекс выходит за границы массива снизу или сверху, генерируется прерывание
с вектором 5. Первый операнд должен быть регистром, содержащим проверяемый индекс,
второй - адресом поля памяти с двумя границами проверяемого массива. В команде
bound допустимо использование как 16-битовых, так и 32-битовых операндов (но
и первый, и второй операнды должны быть одного типа).