Инструкция АЦП в ASM 8086
Когда я использую ADC
для примера:
AL = 01 and BL = 02, and CF = 1
когда я сделаю это:
ADC AL,BL
Будет AL
быть 3
или же 4
? (с CF
дополнение или без?)
4 ответа
Несколько вещей о 8086
ADC
инструкция:
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, так как нет необходимости выполнять добавление.