Инструкция ADC в ASM 8086

Когда я использую ADC для экс-клена:

AL = 01 and BL = 02, and CF = 1

когда я делаю это:

ADC AL,BL 

Будет AL быть 3 или 4? (с CF дополнение или без?)

11
задан Paul R 22 April 2010 в 07:36
поделиться

4 ответа

Немногое об инструкции 8086 ADC :

Syntax: adc dest, src
dest: memory or register
src:  memory, register, or immediate
Action: dest = dest + src + CF

Ясно, что действие указывает флаг переноса ( CF ) будет добавлено, поэтому результат будет 4 , а не 3 .

11
ответ дан 3 December 2019 в 04:31
поделиться

AL будет 4. ADC означает добавить с переносом , поэтому, конечно, перенос суммируется . CF ] возвращается в 0, так как рассматриваемое добавление не выполняется.

4
ответ дан 3 December 2019 в 04:31
поделиться

Будет 4. ADC (добавить с переносом) добавляет дополнительную единицу, если флаг переноса (CF) равен 1. См. Полное описание код операции здесь .

4
ответ дан 3 December 2019 в 04:31
поделиться

Это не отличается от сложения по основанию 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, с добавлением непосредственно под ним.

Это также причина, по которой сдвиги или повороты вращаются через бит переноса, поэтому вы можете сделать битовый сдвиг шире, чем ширина регистра / ячейки памяти.

Двоичное умножение мучительно просто по сравнению с десятичным, но я избавлю вас от этого и позволю вам подумать об этом.

Да, вы могли и должны были написать программу, чтобы опробовать это. И все же могу, я мог намеренно вести вас по пути дезинформации.

5
ответ дан 3 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: