Assembler ADC

0

Czesc, szybkie pytanko, co znaczy instrukcja

ADC ??
Nie za bardzo rozumiem o co w tym chodzi

0

dodanie z przeniesieniem (add with carry), do docelowego rejestru dodawana jest wartosc 1 jesli flaga carry (CF flag) jest ustawiona, przyklad:

; ustaw eax = 2
mov eax,2

; flaga przeniesienia = 1 (setc ja ustawia, clc resetuje)
setc

; eax = eax + stan flagi przeniesienia, czyli 2 + 0 + 1
adc eax,0

; eax = 3

operacje adc/sbb (odejmowania) czesto sa wykorzystywane np. w bibliotekach bignum do obliczen na duzych liczbach oraz w algorytmach kompresji

0

Czyli w takim razie co robi adc w tym wypadku?
Strasznie mi trudno zrozumieć ten język...

mov eax, 0xF0710001         ;jakis random hex
disp_bin:
mov esi, eax            ; nie widze celu, zamiast tego można by włozyć hexa od razu do esi, ale sądząc że tego nie zrobili to chyba tak nie można
mov cx,32          ;tego na prawde nie rozumiem
L1:         ;label
xor eax,eax         ;zerowanie eax, czy przypadkiem nie mozna bylo tego zrobic poza petla?
shl esi,1        ;dzielenie przez 2
adc al, '0'     ; nie wiem
mov ah,0eh 
int 10      ;nie wiem cpo to znaczy ale to spobie znajde
loop L1
mov ah,0        ;czekaj na nacisniecie klawisza
int 16h
mov ah, 4ch
int 21h       ;zakoncz
0

Ogólnie x86 znam pobieżnie, ale w tym wypadku shl przesuwa liczbę w lewo, zapisując tracony bit w bicie przeniesienia. Do pustego eax dodawany jest znak 0, oraz flaga przeniesienia. Dzięki temu uzyskujesz bity w formacie znaków od lewej strony, tak, jak je się wypisuje na ekranie (są dwie możliwości, cf=0 -> al='0' lub cf=1 -> al='1'). W ecx jest 32, liczba bitów w 4 bajtowej liczbie, potrzebne do wypisania wszystkich bitów. To kopiowanie z eax do esi jest chyba tylko w celu umożliwienia stosowania tej procedury (disp_bin), gdy wartość jest podana w eax, a nie zakodowana jak w tym przypadku. Do ah wpisujesz 0xe (14) w celu wypisania znaku przez przerwanie 10 (nie, nie wiem co dokładnie to robi, ale tak wynika z kodu).

0

wypisuje postać binarną F0710001 na ekran (od lewej do prawej), czyli wyświetli 11110000011100010000000000000001

  1. rejestr CX zawiera licznik 32 bitów, do CX ponieważ instrukcja loop bazuje na sprawdzaniu CX/ECX
  2. xor eax,eax zeruje rejestr AL, który będzie wykorzystany do zapisania przekonwertowanej wartości
  3. kolejne bity z esi sa "wypychane" poza 32 bitowy licznik i ich wartości lądują we fladze carry
  4. potem AL przekształcane jest na znak 0 lub 1, czyli al = '0' + stan flagi carry (1 dla 1, 0 dla 0 ;), właśnie to robi adc
  5. kolejne znaki są wyświetlane na ekranie (http://en.wikipedia.org/wiki/INT_10H)
  6. pętla powtarza operacje dla wszystkich 32 bitów wartości początkowej z EAX

(sory, net mi padł w trakcie odpowiedzi i po ponownym podłączeniu kliknąłem dodaj, nie widząc, że już jest odpowiedź)

1 użytkowników online, w tym zalogowanych: 0, gości: 1