Czesc, szybkie pytanko, co znaczy instrukcja
ADC ??
Nie za bardzo rozumiem o co w tym chodzi
Czesc, szybkie pytanko, co znaczy instrukcja
ADC ??
Nie za bardzo rozumiem o co w tym chodzi
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
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
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).
wypisuje postać binarną F0710001 na ekran (od lewej do prawej), czyli wyświetli 11110000011100010000000000000001
(sory, net mi padł w trakcie odpowiedzi i po ponownym podłączeniu kliknąłem dodaj, nie widząc, że już jest odpowiedź)