[asm] Maskowanie bitów

0

Potrzebuję pomocy w wyjaśnieniu operacji bitowych.

and ax, 00ffh; a) zeruje starszy bit rejestru AX. Dlaczego nie mogę napisac and ax, 0fh?

or ax, 8 ; b) trzeci bit ustawia na 1. Dlaczego akurat trzeci?

or bx, 0f000h ; c) ustawia starsze cztery bity na 1. Dlaczego jest 5 cyfr i dlaczego cztery starsze bity?

Rozumiem znaczenie and i or, oraz to że rejestry ax, bx są 16 bitowe. Rozumiem też że "0" to zero a "f" to 1.
Nie rozumiem jak użuwac tego drugiego argumentu czyli tutaj 00ffh, 8, 0f000h. Dlaczego w przypadku a) nie mogę napisac and ax, 0fh?
Dlaczego w przypadku c) ta liczba ma 5 cyfr a w przykładzie a) miała 4 ? I dlaczego to 0f000h ustawia akurat starsze cztery bity?
Dlaczego w przykładzie b) ósemka ustawia akurat trzeci bit?
Dzięki z góry za zainteresowanie!

0

F to nie 1 tylko 15 (dziesiętne), a więc binarnie F(hex) = 1111(bin).

AND AX, 00FFh

00FFh oznacza 16 bitów - 8 pierwszych to 0, osiem pozostałych to 1.

00FFh = 0000 0000 1111 1111(bin)

Operacja więc zeruje (AND z bitem 0) pierwsze 8 bitów liczby z AX i pozostawia pozostałe 8 nie zmienionych (AND z bitem 1)

OR AX, 8

8 = 1000(bin)

Więc licząc od bitu zerowego, operacja ustawia bit 3.

OR BX, 0F000h

0F000h = 1111 0000 0000 0000 (bin)

Zero z przodu jest istotne, ponieważ liczba szesnastkowa w zapisie musi zaczynać się od cyfry. Gdy z przodu jest litera, trzeba dopisać wiodące zero. Dlatego 0FF00h jest tak naprawdę wartością FF00h (czyli 16bitów; 0Fh ma tylko 8 bitów - przypisanie 8 bitów do rejestru 16 bitowego nie jest poprawne dla większości kompilatorów).

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