Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- typedef union {
- unsigned char BYTE;
- struct {
- unsigned char a : 3;
- unsigned char b : 3;
- unsigned char c : 2;
- }bits;
- }un_X;
- un_X x;
- int main() {
- x.bits.a = 0x02;
- x.bits.b = 0x00;
- /*
- C jest 2 bitowy, jego wynikiem może być 0, 1, 2, 3
- 0^0 = 0
- 3^0 = 1
- 3^1 = 3
- 1^7 = 1
- */
- printf("a: %x\n", x.bits.a);
- printf("b: %x\n", x.bits.b);
- printf("c: %x\n\n", x.bits.c);
- __asm {
- MOV dl, x.BYTE
- MOV al, 0x07 //maska dla a
- AND al, dl //przepisz pierwsze 3 bity z dl do al, bo
- // 0x07 = 00 000 111
- // maska= c b a
- JZ koniec //jesli bl to 0x00 to skocz na sam koniec i wypisz al - czyli zero
- MOV ah, al //skopiuj al na potem
- MOV al, 0x01
- MOV bl, 0x38 //maska dla b
- AND bl, dl //przepisz 4,5,6 bit
- SHR bl, 3 //przesuń na sam początek zmiennej bl
- JZ koniec //jeśli bl to 0x00 to skocz na sam koniec i wypisz al, czyli 1
- // x = cokolwiek
- // wykluczone zostalo 0^x, x^0
- // pozostało 1^1, 3^1, 1^7
- // w tych przypadkach wynikiem jest podstawa potęgi
- MOV al, ah //przywróc stare al
- koniec:
- // al juz jest wynikiem, czyli 0 po pierwszym skoku z linijki 37 albo 1 po skoku z 45 albo 2-3 po przywróceniu starego al
- AND dl, 0x3F //maska dla a i b (żeby c było wyzerowane)
- SHL al, 6 //przesuwamy wynik do pola c
- OR dl, al
- MOV x.BYTE, dl
- }
- printf("a: %x\n", x.bits.a);
- printf("b: %x\n", x.bits.b);
- printf("c: %x\n\n", x.bits.c);
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment