Nizax

ASK unia

Jan 18th, 2019
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.50 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. typedef union {
  4. unsigned char BYTE;
  5. struct {
  6. unsigned char a : 3;
  7. unsigned char b : 3;
  8. unsigned char c : 2;
  9. }bits;
  10. }un_X;
  11.  
  12. un_X x;
  13.  
  14. int main() {
  15. x.bits.a = 0x02;
  16. x.bits.b = 0x00;
  17. /*
  18. C jest 2 bitowy, jego wynikiem może być 0, 1, 2, 3
  19. 0^0 = 0
  20. 3^0 = 1
  21. 3^1 = 3
  22. 1^7 = 1
  23. */
  24.  
  25. printf("a: %x\n", x.bits.a);
  26. printf("b: %x\n", x.bits.b);
  27. printf("c: %x\n\n", x.bits.c);
  28.  
  29. __asm {
  30. MOV dl, x.BYTE
  31.  
  32.  
  33. MOV al, 0x07 //maska dla a
  34. AND al, dl //przepisz pierwsze 3 bity z dl do al, bo
  35. // 0x07 = 00 000 111
  36. // maska= c b a
  37. JZ koniec //jesli bl to 0x00 to skocz na sam koniec i wypisz al - czyli zero
  38.  
  39. MOV ah, al //skopiuj al na potem
  40. MOV al, 0x01
  41.  
  42. MOV bl, 0x38 //maska dla b
  43. AND bl, dl //przepisz 4,5,6 bit
  44. SHR bl, 3 //przesuń na sam początek zmiennej bl
  45. JZ koniec //jeśli bl to 0x00 to skocz na sam koniec i wypisz al, czyli 1
  46.  
  47.  
  48. // x = cokolwiek
  49. // wykluczone zostalo 0^x, x^0
  50. // pozostało 1^1, 3^1, 1^7
  51. // w tych przypadkach wynikiem jest podstawa potęgi
  52.  
  53. MOV al, ah //przywróc stare al
  54.  
  55.  
  56. koniec:
  57. // 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
  58. AND dl, 0x3F //maska dla a i b (żeby c było wyzerowane)
  59. SHL al, 6 //przesuwamy wynik do pola c
  60. OR dl, al
  61. MOV x.BYTE, dl
  62. }
  63.  
  64. printf("a: %x\n", x.bits.a);
  65. printf("b: %x\n", x.bits.b);
  66. printf("c: %x\n\n", x.bits.c);
  67.  
  68. system("pause");
  69. return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment