Когда я использую ADC
, например:
AL = 01 and BL = 02, and CF = 1
когда я делаю это:
ADC AL,BL
Будет ли AL
3
или 4
? (с добавлением CF
или без?)
Когда я использую 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
.
Это ничем не отличается от сложения по основанию 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 с «carry the one», поступающим до того, как вы начнете.
посмотрите на него по одному столбцу справа, как в десятичной математике
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-битный алюминий.
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-битным сумматором, пока он двоичный, это тривиально.
Все полезные процессоры должны каким-то образом добавлять бит переноса, чтобы можно было расширить алюминий. Иногда есть отдельные add и adc, некоторые adc являются дополнительным шагом, или наиболее болезненным будет добавление без переноса и использование ветки, если перенос очищен с непосредственным добавлением под ним.
По этой же причине сдвиги или повороты вращаются через бит переноса, поэтому вы можете сделать битовый сдвиг шире, чем ширина ячейки регистра/памяти.
двоичное умножение мучительно просто по сравнению с десятичным, но я избавлю вас от этого и дам вам подумать об этом.
Да, вы могли бы и должны были написать программу, чтобы попробовать это. И все еще могу, я мог намеренно вести вас по пути дезинформации.
AL
будет равно 4. ADC
означает add with carry
, поэтому, конечно, перенос суммируется. CF
снова устанавливается равным 0, так как рассматриваемого сложения переноса нет.
1FF
в AX и, опять же, CF на 0.
- person Alex Martelli; 22.04.2010
Это будет 4. ADC (добавить с переносом) добавляет дополнительную 1, если флаг переноса (CF) равен 1. См. полное описание кода операции здесь.