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

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

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

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

ADC AL,BL 

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


person Tal    schedule 22.04.2010    source источник
comment
Попробуйте и возьмите за привычку проверять эти вещи на себе — это отличный способ научиться.   -  person Paul R    schedule 22.04.2010
comment
+1 Пол Р. Тал, вы научитесь намного быстрее и получите гораздо более точные результаты, если будете тестировать такие вещи самостоятельно. За то время, которое вам потребовалось, чтобы ввести этот вопрос и прояснить ситуацию в различных ответах ниже, вы могли протестировать каждый сценарий и получить окончательный ответ, изучая при этом некоторые фундаментальные вещи о процессорах, регистрах и флагах.   -  person JUST MY correct OPINION    schedule 22.04.2010


Ответы (4)


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

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

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

person codaddict    schedule 22.04.2010
comment
а что если я сделаю так: AX = FF, BX = FF, CF = 1 и ADC AX,BX Что произойдет? Я имею в виду, где компьютер будет хранить лишний байт? Спасибо!! - person Tal; 22.04.2010
comment
@Tal: Если вы это сделаете, AX будет 0x01FF, а CF будет 0. Лишнего байта нет. - person Adam Rosenfield; 22.04.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.

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

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

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

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

person old_timer    schedule 22.04.2010

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

person Alex Martelli    schedule 22.04.2010
comment
а что если я сделаю так: AX = FF, BX = FF, CF = 1 и ADC AX,BX Что произойдет? Я имею в виду, где компьютер будет хранить лишний байт? Спасибо!! - person Tal; 22.04.2010
comment
@Tal, AX и BX полностью могут хранить более одного байта (поскольку вы не используете здесь однобайтовые регистры, такие как AL и BL!), Поэтому результатом будет 1FF в AX и, опять же, CF на 0. - person Alex Martelli; 22.04.2010

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

person Adam Rosenfield    schedule 22.04.2010