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

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

10 голосов
/ 22 апреля 2010

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

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

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

ADC AL,BL 

AL будет 3 или 4? (с добавлением CF или без?)

Ответы [ 4 ]

10 голосов
/ 22 апреля 2010

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

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

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

4 голосов
/ 22 апреля 2010

Ничем не отличается от добавления в базу 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. 1. 1011 *

Не отличается от десятичной математики, описанной выше, просто намного проще, когда вы складываете столбец в десятичном виде, операнд 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 - это дополнительный шаг, или наиболее болезненным будет добавление без переноса и использование ветки, если перенос выполняется с добавлением непосредственно под ним.

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

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

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

3 голосов
/ 22 апреля 2010

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

3 голосов
/ 22 апреля 2010

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

...