Инструкция АЦП в ASM 8086

Когда я использую ADC для примера:

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

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

ADC AL,BL 

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

4 ответа

Несколько вещей о 8086ADC инструкция:

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

Понятно, что в действии написано Флаг несения (CF) будет включен в дополнение, поэтому результат будет 4 не 3,

Это ничем не отличается от добавления в базу 10.

 99
+11

9 + 1 ноль нести 1
9+1+ нести 1 нести 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 нести 1
следующий столбец
1+1+1 = 1 нести 1
...

это продолжается, и вы получите 0xFF с установленным битом переноса

Таким образом, если у вас есть только 8-битное сложение с переносом, вы можете сложить два числа шириной, насколько у вас есть память.

Давайте посмотрим на 16-битное дополнение:

 0x1234
+ 0xABCD

Вы можете просто сделать математику с 16-битным сложением, 0xBE01.

или с 8-битным сумматором:

очистить бит для переноски
добавить с переносом 0x34+0xCD результат 0x01 переносить набор
добавить с переносом 0x12+0xAB результат 0xBE переносить очистить

так что ответ 0xBE01

Или используя 4-битный сумматор, если все, что у вас есть, это 4-битный alu

очистить бит для переноски
добавить с установленным переносом 0x4+0xD = 0x1
добавить с переносом 0x3+0xC = 0x0 установить бит переноса
добавить с переносом 0x2+0xB = 0xE сбросить бит переноса
добавить с переносом 0x1+0xA = 0xB очистить бит переноса

снова результат 0xBE01 нести бит ясно

мы могли бы сделать это и с одиночными битами или с 3-битным сумматором, если он двоичный, то он тривиален.

У всех полезных процессоров должен быть какой-то способ добавить бит переноса, чтобы вы могли расширить alu. Иногда существуют отдельные add и adc, некоторые adc - это дополнительный шаг, или наиболее болезненным будет добавление без переноса и использование ветки, если перенос выполняется с добавлением непосредственно под ним.

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

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

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

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

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

Другие вопросы по тегам