Когда я использую ADC
для экс-клена:
AL = 01 and BL = 02, and CF = 1
когда я делаю это:
ADC AL,BL
Будет AL
быть 3
или 4
? (с CF
дополнение или без?)
Немногое об инструкции 8086
ADC
:
Syntax: adc dest, src
dest: memory or register
src: memory, register, or immediate
Action: dest = dest + src + CF
Ясно, что действие указывает флаг переноса ( CF
) будет добавлено, поэтому результат будет 4
, а не 3
.
AL
будет 4. ADC
означает добавить с переносом
, поэтому, конечно, перенос суммируется . CF
] возвращается в 0, так как рассматриваемое добавление не выполняется.
Будет 4. ADC (добавить с переносом) добавляет дополнительную единицу, если флаг переноса (CF) равен 1. См. Полное описание код операции здесь .
Это не отличается от сложения по основанию 10.
99 +11 9+1 is zero carry the 1 9+1+carry is 1 carry the 1
Результатом вышеупомянутого десятичного вычисления будет 10 с переносом 1 или 110, если вы хотите думать об этом именно так.
Для двоичного начала с однобитовым сумматором, вот таблица истинности:
000 0 0 001 0 1 010 0 1 011 1 0 100 0 1 101 1 0 110 1 0 111 1 1
левый столбец из трех битов - это входные комбинации, два операнда и перенос, второй столбец выполняется и третий столбец - это результат
, поэтому 1 + 1 без переноса равно 110 в левом столбце, а результат - 0, переносящий 1.
Ничем не отличается от десятичной математики выше, просто намного проще, когда вы складываете столбец в десятичной системе счисления, операнд a, операнд b, перенос. Результатом является ответ по модулю 10, а перенос - результат / 10. скопируйте перенос в верхнюю часть следующего столбца и повторяйте до бесконечности. как показано с 99 + 11 или 999 + 111 и т. д.
Для более простого двухбитового сложения без переноса результатом является xor входов, а переносом - и двух входов. Вы можете реализовать добавление с переносом, используя два добавления без связанных сумматоров переноса, или сделать это напрямую. Результат устанавливается, когда есть нечетное количество единиц или нечетная четность, что составляет два xors r = a xor b xor.
так что 8-битный 0xFF + 0xFF с установленным переносом даст
1 11111111 +11111111
Это показывает 0xff + 0xff с "переносом одного", поступившим перед тем, как вы начнете.
смотрите на него по столбцу справа, точно так же, как десятичная математика
1+1+1 = 1 carry the 1 next column 1+1+1 = 1 carry the 1 ...
, это продолжается, и вы получаете 0xFF с установленным битом переноса
Итак, если бы у вас был только 8-битный сложить с переносом, вы можете сложить два числа равной ширине вашей памяти.
Давайте посмотрим на 16-битное сложение:
0x1234 +0xABCD
Вы можете просто посчитать, используя 16-битное сложение, 0xBE01.
или с 8-битным сумматором:
clear the carry bit add with carry 0x34+0xCD result 0x01 carry set add with carry 0x12+0xAB result 0xBE carry clear
так что ответ будет 0xBE01
Или используя 4-битный сумматор, если все, что у вас есть, это 4-битный alu
clear the carry bit add with carry 0x4+0xD = 0x1 carry bit set add with carry 0x3+0xC = 0x0 carry bit set add with carry 0x2+0xB = 0xE carry bit clear add with carry 0x1+0xA = 0xB carry bit clear
, снова результат 0xBE01 перенести бит очищен
мы можно было бы сделать это также с одиночными битами или 3-битным сумматором, если он двоичный, это тривиально.
Все полезные процессоры должны иметь способ добавить бит переноса, чтобы вы могли расширить alu. Иногда есть отдельные add и adc, некоторые adc - это дополнительный шаг, или наиболее болезненным было бы добавление без переноса и использование ветки, если переносить clear, с добавлением непосредственно под ним.
Это также причина, по которой сдвиги или повороты вращаются через бит переноса, поэтому вы можете сделать битовый сдвиг шире, чем ширина регистра / ячейки памяти.
Двоичное умножение мучительно просто по сравнению с десятичным, но я избавлю вас от этого и позволю вам подумать об этом.
Да, вы могли и должны были написать программу, чтобы опробовать это. И все же могу, я мог намеренно вести вас по пути дезинформации.