Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <ctime>
  4.  
  5. using namespace std;
  6.  
  7.  
  8. void print(int** ptr, int rows, int cols){
  9. for (int i = 0; i < rows; ++i){
  10. for (int j = 0; j < cols; ++j){
  11. cout << setw(4) << ptr[i][j] << " ";
  12. }
  13. cout << endl;
  14. }
  15. }
  16.  
  17. void create(int*** ptr, int rows, int cols){
  18. (*ptr) = new int*[rows];
  19. for (int i = 0; i < rows; ++i){
  20. (*ptr)[i] = new int[cols];
  21. for (int j = 0; j < cols; ++j){
  22. (*ptr)[i][j] = rand() % 100;
  23. }
  24. }
  25. }
  26.  
  27. // zwroc uwage na to ,ze tworzysz tyle tablic i usuwasz tez. Patrz petla for i ,ze jedna tablica jest bez petli for !!@
  28.  
  29. void dispose(int** ptr, int rows){
  30. for (int i = 0; i < rows; ++i){
  31. delete[] ptr[i];
  32. }
  33. delete[] ptr;
  34. }
  35.  
  36. int main(int **tab,int n){
  37.  
  38. srand((unsigned)time(0));
  39.  
  40. int** wsk;
  41.  
  42. int rows = 15;
  43. int cols = 15;
  44.  
  45. create(&wsk, rows, cols);
  46. // macierz ktora zeruje wszystko
  47. //print(wsk, rows, cols);
  48.  
  49. //__asm{
  50. // pushad
  51. // pushfd
  52. // mov ecx, rows;// ECX <- rozmiar(i - liczbwa wierszy) tablicy wskaznikow do tablic wewnetrznych
  53. //
  54. //_zewn:;// petla po tablice zezwnetrznej po i !
  55.  
  56. // mov esi, wsk; // to jest po prostu ptr // wczytujemy do rejestru adres tablice wskaznikow na tablice wewnetrzne ( ESI <- adres bazowy tablizy wskaznikow do tablic wewnetrznych)
  57. // mov esi, [esi + 4 * ecx - 4];// ptr[i] // do rejestru esi wpisujemy adres bazowy tablicy wewnetrznej // ta komenda pozwala isc po ecx ktore jest wierszem czyli adresem tablicy wewnetrnzej
  58. // push ecx
  59. // mov ecx, cols; // rozmiar ptr[i] czyli jego dlugosc (j - liczba kolumn) // kolumny ( a tak naprawde to jest dlugosc (rozmiar) tablice wewnetrznej) // ecx <- rozmiar (liczba kolumn) tablic wewnetrznych
  60. //_wewn:;//
  61. // mov dword ptr[esi + 4 * ecx - 4],0
  62. // loop _wewn
  63.  
  64. // pop ecx
  65. // loop _zewn
  66.  
  67. // popfd
  68. // popad
  69. //}
  70.  
  71. // macierz ktora zeruje przekatna (PATRZ NA CONTINUE I WARUNEK)
  72. //__asm{
  73. // pushad
  74. // pushfd
  75. // mov ecx, rows;// ECX <- rozmiar(i - liczbwa wierszy) tablicy wskaznikow do tablic wewnetrznych
  76.  
  77. //_zewn:;// petla po tablice zezwnetrznej po i !
  78.  
  79. // mov esi, wsk; // to jest po prostu ptr // wczytujemy do rejestru adres tablice wskaznikow na tablice wewnetrzne ( ESI <- adres bazowy tablizy wskaznikow do tablic wewnetrznych)
  80. // mov esi, [esi + 4 * ecx - 4];// ptr[i] // do rejestru esi wpisujemy adres bazowy tablicy wewnetrznej // ta komenda pozwala isc po ecx ktore jest wierszem czyli adresem tablicy wewnetrnzej
  81. // push ecx
  82. // mov ebx,ecx
  83. // mov ecx, cols; // rozmiar ptr[i] czyli jego dlugosc (j - liczba kolumn) // kolumny ( a tak naprawde to jest dlugosc (rozmiar) tablice wewnetrznej) // ecx <- rozmiar (liczba kolumn) tablic wewnetrznych
  84. //
  85. //_wewn:;//
  86. // cmp ebx, ecx
  87. //
  88.  
  89. // JNZ _continue
  90. // mov dword ptr[esi + 4 * ecx - 4], 0
  91. //_continue:
  92.  
  93. // loop _wewn
  94.  
  95. // pop ecx
  96. // loop _zewn
  97.  
  98. // popfd
  99. // popad
  100. //}
  101.  
  102. // zerowanie tylko elementow parzystych
  103. __asm{
  104. pushad
  105. pushfd
  106. mov ecx, rows;// ECX <- rozmiar(i - liczbwa wierszy) tablicy wskaznikow do tablic wewnetrznych
  107.  
  108. _zewn:;// petla po tablice zezwnetrznej po i !
  109.  
  110. mov esi, wsk; // to jest po prostu ptr // wczytujemy do rejestru adres tablice wskaznikow na tablice wewnetrzne ( ESI <- adres bazowy tablizy wskaznikow do tablic wewnetrznych)
  111. mov esi, [esi + 4 * ecx - 4];// ptr[i] // do rejestru esi wpisujemy adres bazowy tablicy wewnetrznej // ta komenda pozwala isc po ecx ktore jest wierszem czyli adresem tablicy wewnetrnzej
  112. push ecx
  113. mov ebx, ecx
  114. mov ecx, cols; // rozmiar ptr[i] czyli jego dlugosc (j - liczba kolumn) // kolumny ( a tak naprawde to jest dlugosc (rozmiar) tablice wewnetrznej) // ecx <- rozmiar (liczba kolumn) tablic wewnetrznych
  115.  
  116. _wewn:;//
  117. xor edx,edx
  118. mov eax,0
  119. mov edi, dword ptr[esi+4*ecx-4]
  120. bt edi,eax // sprawddzenie czy bit 0 w danej liczbie jest zerem. bo wtedy masz parzysta lcizbe i zerujemy, jesli jest 1 to wtedy masz
  121. Jc _continue
  122. mov dword ptr[esi + 4 * ecx - 4], 0
  123. _continue:
  124.  
  125. loop _wewn
  126.  
  127. pop ecx
  128. loop _zewn
  129.  
  130. popfd
  131. popad
  132. }
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139. print(wsk, rows, cols);
  140. dispose(wsk,rows);
  141. system("pause");
  142. return 0;
  143.  
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement