Wpis z mikrobloga

Witam!

Jak dokładnie działa funkcja TEST w asemblerze 8086?

Mam taki króciutki fragment kodu:




w ax siedzi obecnie 16 bitowa wartosc, informujaca o obecnosci badz braku komponentów komputera (np. koprocesora, liczby pamieci ram itd.)

Na bitach 1010001011011100 mieści się informacja dot. pamięci RAM.

00 - blad odczytu
01 - 16 kb RAM
10 - 32 kb RAM
11 - 64+kb RAM

i tak pogrubione bity tworzą razem wartość 12, z ktorą jest w pierwszej lini zamieszczonego kodu porównywany akumulator.
funkcja test sprawdza, czy ta para bitów tworzy razem tą dwunastke, ale dzieje się to dla mnie na niezrozumiałej zasadzie - bowiem moim zdaniem porównując 12 z obecnoscia obu tych bitów powinna sie zapalić flaga zera (no bo porownanie dziala na zasadzie odejmowania arytmetycznego), a dzieje sie zupelnie na odwrót.. Dlaczego?

#programowanie #assembler #asembler
  • 16
@FailedNormie no dobra, to rozumiem. Gdybym chciał przeczytać tylko jeden bit (powiedzmy ostatni), to flaga ZERA ustawiła by się momencie, gdy wynik tej operacji jest zerem. Natomiast jak to sie ma do porównywania PARY bitów na raz?
@FailedNormie:

no bo zobacz, załóżmy mamy sobie taki ciag:

AX = 10010100

Twoj plan polega na tym, aby zanegowac AX czyli:

AX = 01101011

sprawdzić bit 3 i 4

i powrocic do AX = 10010100

przy czym Twoja instukcja zadziala na JZ, a nie JNZ - czyli zrobiles dokladnia to samo sprawdzanie, tylko zrobiles to w odwrotny sposob :D
To co @FailedNormie podał jest fajnym przykładem na to jak to zrobić wykorzystując TEST, ale tak szczerze, to bym raczej tu na czytelność postawił, i zrobił po prostu tak:

and ax, 0Ch ; ew wczesniej zachować ax gdzieś
cmp ax, 4
je costam16
cmp ax, 8
je costam32
cmp ax, 0Ch
je costam64