2010-04-22 18 views
8

Gdy używam ADC dla exmaple:ADC instrukcja w ASM 8086

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

kiedy robię to:

ADC AL,BL 

Will AL być 3 lub 4? (Z dodatkiem lub bez CF?)

+4

Spróbuj i przyzwyczaić się do testowania tych rzeczy dla siebie - to świetny sposób na naukę. –

+0

+1 Paul R. Tal, nauczysz się o wiele szybciej i uzyskasz o wiele dokładniejsze wyniki, jeśli samodzielnie przetestujesz takie rzeczy. W czasie, w którym zajęło ci wprowadzenie tego pytania i wyjaśnienie różnych odpowiedzi poniżej, mogłeś przetestować każdy scenariusz i uzyskać ostateczną odpowiedź, jednocześnie ucząc się podstawowych rzeczy na temat procesorów, rejestrów i flag. –

Odpowiedz

3

AL będzie 4. ADC oznacza add with carry, więc oczywiście carry jest sumowane w. CF zostanie ustawiony na 0, ponieważ nie ma nieść z dodatkiem w pytanie.

+0

i co jeśli to zrobię: AX = FF, BX = FF, CF = 1 i ADC AX, BX Co się stanie? Mam na myśli, gdzie komputer będzie przechowywać dodatkowy bajt? Dziękuję Ci!! – Tal

+1

@Tal, AX i BX są w stanie przechowywać więcej niż jeden bajt (ponieważ nie używasz rejestrów jednobajtowych, takich jak AL i BL tutaj!), Więc wynikiem będzie '1FF' w AX i, znowu, CF to 0. –

3

Będzie to 4. ADC (dodać z przeniesieniem) dodaje w dodatkowym 1, jeśli flaga przeniesienia (CF) jest 1. Zobacz pełny opis kodu operacji here.

9

kilka rzeczy o instrukcji 8086ADC:

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

Oczywiście działanie mówi Flaga Carry (CF) zostaną uwzględnione w dodatku tak wynik będzie 4 nie 3.

+0

i co jeśli to zrobię: AX = FF, BX = FF, CF = 1 i ADC AX, BX Co się stanie? Mam na myśli, gdzie komputer będzie przechowywać dodatkowy bajt? Dziękuję! – Tal

+0

@Tal: Jeśli to zrobisz, AX będzie 0x01FF, a CF będzie 0. Nie ma dodatkowego bajtu. –

3

Nie inaczej niż dodawanie w bazie 10.

 
99 
+11 

9+1 is zero carry the 1 
9+1+carry is 1 carry the 1 

wyniku powyższej matematyki dziesiętnym wynosi 10 z przeniesienia 1 lub 110, jeśli chce myśleć o tym w ten sposób.

Dla binarnej starcie z jednym bitowego sumatora, tutaj jest tabela prawdy:

 
000 0 0 
001 0 1 
010 0 1 
011 1 0 
100 0 1 
101 1 0 
110 1 0 
111 1 1 

lewa kolumna trzech bitów są kombinacje wejściowe, dwa operandy i nosić w, druga kolumna jest przeprowadzenie a trzecia kolumna jest wynikiem

więc 1 + 1 bez przenoszenia wynosi 110 w lewej kolumnie, a wynik jest 0 nosić 1.

Nie inaczej niż matematyki dziesiętnych powyżej tylko znacznie prostsze, gdy sumujesz kolumnę w dziesiętny, operand a, operand b, carry. Wynik jest odpowiedzią modulo 10, a carry jest wynikiem/10. skopiuj przeniesienie na początek następnej kolumny i powtarzaj na zawsze. jak pokazano za pomocą 99 + 11 lub 999 + 111, itd.

Dla prostszego dodania dwóch bitów bez przenoszenia, wynikiem jest xor wejść, a wykonanie to i dwa wejścia. Możesz zaimplementować add with carry przy użyciu dwóch addów bez dodatkowych łańcuchów lub wykonaj to bezpośrednio. Rezultat jest ustalany, gdy liczba nieparzystych lub nieparzystych parzystości jest dwa razy większa niż xor r = a xor b xor. Prowadzenie, z którym borykam się w tej chwili może ktoś może pomóc.

więc 8-bitowy 0xFF + 0xFF z zestawem do przenoszenia da

 
     1 
11111111 
+11111111 

To pokazuje 0xFF + 0xFF z „nieść jeden” w najbliższych przed rozpoczęciem pracy.

spojrzenie na nią jedna kolumna na raz z prawej, tak jak matematyki dziesiętnych

 
1+1+1 = 1 carry the 1 
next column 
1+1+1 = 1 carry the 1 
... 

to trwa i skończyć z 0xFF z nieco carry ustawić

Więc jeśli miał tylko 8-bitowy dodatek z nośnikiem można dodać dwie liczby tak szerokie, jak pamięć.

Spójrzmy na 16 bit Dodaj:

 
0x1234 
+0xABCD 

może po prostu do matematyki z 16 bit dodać, 0xBE01.

lub sumatora 8 bitów:

 
clear the carry bit 
add with carry 0x34+0xCD result 0x01 carry set 
add with carry 0x12+0xAB result 0xBE carry clear 

więc odpowiedź jest 0xBE01

lub za pomocą 4-bitowy sumator jeśli wszystko masz to 4-bitowy 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 

ponownie wynik 0xBE01 carry bit clear

możemy to zrobić z pojedynczymi bitami lub 3-bitowym sumatorem, tak długo ponieważ jest binarny, jest trywialny.

Wszystkie przydatne procesory muszą mieć jakiś sposób na dodanie bitu przenoszenia, aby można było rozszerzyć alu. Czasami istnieją osobne add i adc, niektóre adc są dodatkowym krokiem lub najbardziej bolesnym byłoby dodanie bez przenoszenia i korzystania z oddziału, jeśli jest to jasne, z dodanym natychmiast pod nim.

Z tego powodu przesunięcia i obroty obracają się poprzez bity przenoszenia, dzięki czemu można przesunąć nieco przesunięcie szersze niż szerokość położenia rejestru/pamięci.

mnożenie binarne jest boleśnie proste w porównaniu z dziesiętnym, ale oszczędzę ci tego i pozwolę ci o tym pomyśleć.

Tak, mogłeś i powinieneś był napisać program, aby to wypróbować. I nadal mogę, mógłbym celowo poprowadzić cię ścieżką dezinformacji.