<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5342228221192121358</id><updated>2011-04-22T00:29:30.264+02:00</updated><category term='asembler'/><category term='wskaźniki'/><title type='text'>Ja - programista</title><subtitle type='html'>&lt;code&gt;int main() &lt;br /&gt;
{&lt;br /&gt;
    std::cout &lt;&lt; "Hello world!\n";&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;/code&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://michalmet-cpp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342228221192121358/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://michalmet-cpp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Michał</name><uri>http://www.blogger.com/profile/00763948677439190388</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5342228221192121358.post-8299450206281567550</id><published>2009-05-27T19:31:00.004+02:00</published><updated>2009-05-27T19:45:50.154+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asembler'/><title type='text'>Wywołanie funkcji pow w asemblerze (crt_pow)</title><content type='html'>Dzisiaj natknąłem się na niemały problem.. jak można potęgować dwie liczby zmiennoprzecinkowe w asemblerze. Poszukiwania zacząłem od plików nagłówkowych masma, ale niestety jedyny mój trop właściwie prowadził tylko do funkcji crt_pow. Ale niestety, biblioteki masma są wręcz beznadziejnie opisane (w przeciwieństwie do MSDN :P) więc zajęło mi trochę czasu, by cokolwiek znaleźć przez google.. ale nic nie wygooglowałem. Także trzeba było znaleźć rozwiązanie metodą prób i błędów. Rozwiązanie okazało się dosyć proste ;)&lt;br /&gt;&lt;br /&gt;Najpierw musimy dołączyć do naszego programu nagłówek msvcrt.inc oraz bibliotekę msvcrt.lib. Następnie w odpowiednim miejscu programu wpisujemy:&lt;br /&gt;&lt;code&gt;LOCAL tmp:DWORD        ; potrzebujemy zmiennej pomocniczej&lt;br /&gt;...&lt;br /&gt;finit                  ; inicjujemy koprocesor&lt;br /&gt;mov tmp, 2             ; pobieramy liczbę 2&lt;br /&gt;fild tmp               ; wrzucamy ją na stosu koprocesora&lt;br /&gt;mov tmp, 5             ; pobieramy liczbę 5&lt;br /&gt;fild tmp               ; wrzucamy ją na stos koprocesora&lt;br /&gt;; teraz mamy st0 = 5, st1 = 2&lt;br /&gt;sub esp, 16            ; inicjujemy 16 bajtów miejsca na stosie programu&lt;br /&gt;fstp qword ptr[esp]    ; pierwszą liczbą umieszczoną na stosie jest 5&lt;br /&gt;fstp qword ptr[esp+8]  ; drugą - 2&lt;br /&gt;call crt_pow           ; obliczamy 5^2&lt;br /&gt;add esp, 16            ; "zdejmujemy" dwie liczby ze stosu&lt;br /&gt;; z otrzymaną wartością można zrobić cokolwiek ;)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Wynik potęgowania pozostaje w st0, czyli na szczycie stosu koprocesora. Jak widać, nie jest to aż tak trudne zadanie jak się może wydawać ;) Ważne jest, by pamiętać o odpowiednich zmianach wartości wskaźnika stosu.&lt;br /&gt;&lt;br /&gt;Mam nadzieję, że choć komuś to pomogło, w szczególności osobom, które nie mają zbyt wiele doświadczenia w asemblerze.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342228221192121358-8299450206281567550?l=michalmet-cpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://michalmet-cpp.blogspot.com/feeds/8299450206281567550/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5342228221192121358&amp;postID=8299450206281567550' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342228221192121358/posts/default/8299450206281567550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342228221192121358/posts/default/8299450206281567550'/><link rel='alternate' type='text/html' href='http://michalmet-cpp.blogspot.com/2009/05/wywoanie-funkcji-pow-w-asemblerze.html' title='Wywołanie funkcji pow w asemblerze (crt_pow)'/><author><name>Michał</name><uri>http://www.blogger.com/profile/00763948677439190388</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342228221192121358.post-1735972990392206550</id><published>2008-03-26T11:22:00.004+01:00</published><updated>2008-03-26T11:58:54.665+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wskaźniki'/><title type='text'>Wskaźniki na... "coś"</title><content type='html'>Zdarza się, że potrzebujemy w jednym obiekcie przechować dane więcej niż tylko jednego konkretnego typu. Np. chcielibyśmy otrzymać stos czy jakąś listę, na której znalazłyby się liczby zmiennoprzecinkowe, stałoprzecinkowe, łańcuchy znaków albo nawet obiekty dowolnej klasy. I co wtedy można zrobić? Teoretycznie można by wykorzystać unię - ale jest to dobre tylko dla niewielkich obiektów. Lepszym wyjściem byłoby użycie jakiegoś wskaźnika (przecież wskaźnik na dowolny typ na jednej platformie zajmuje zawsze tyle samo miejsca, dla 32-bit: 4B). No to świetnie, idea już jest, ale zaraz.. jak takie coś można właściwie zrobić? Jaki typ ma być tego wskaźnika?&lt;br /&gt;&lt;br /&gt;Wskaźnik musi być zadeklarowany tak:&lt;br /&gt;&lt;code&gt;void* Wartosc;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;No świetnie, ale jeszcze chyba jednego brakuje... przecież tak naprawdę nie wiemy, co (jaki typ) będzie wskazywane przez ten nasz nowy wskaźnik... może tam być dosłownie wszystko. Dlatego rozszerzymy sobie tą deklarację na klasę:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;class TElement {&lt;br /&gt;  public:&lt;br /&gt;    void* Wartosc;&lt;br /&gt;    short int Typ;&lt;br /&gt;};&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Typ będzie nam potrzebny do tego, by potem uzyskiwać odpowiednie dane.&lt;br /&gt;Na koniec musimy jeszcze oczywiście wprowadzić dane:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;int* Calkowita;&lt;br /&gt;double* ZmiennoPrzecinkowa;&lt;br /&gt;TElement Tablica[2];&lt;br /&gt;&lt;br /&gt;Calkowita = new int;&lt;br /&gt;*Calkowita = 5;&lt;br /&gt;Tablica[0].Wartosc = Calkowita;&lt;br /&gt;Tablica[0].Typ = 1; // int&lt;br /&gt;ZmiennoPrzecinkowa = new double;&lt;br /&gt;*ZmiennoPrzecinkowa = 3.445;&lt;br /&gt;Tablica[1].Wartosc = ZmiennoPrzecinkowa;&lt;br /&gt;Tablica[1].Typ = 2; // double&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Oczywiście, nie byłoby to nam do niczego potrzebne, gdybyśmy jeszcze nie wiedzieli, jak potem to wykorzystać. A i to wcale nie jest znowu takie trudne; ważne jest rzutowanie naszego wskaźnika na odpowiedni wskaźnik... Może przykład to rozjaśni:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;switch (Tablica[0].Typ) {&lt;br /&gt;  case 1:&lt;br /&gt;    Calkowita = static_cast&amp;lt;int*&amp;gt; (Tablica[0].Wartosc);&lt;br /&gt;    cout &lt;&lt; *Calkowita;&lt;br /&gt;    break;&lt;br /&gt;  case 2:&lt;br /&gt;    ZmiennoPrzecinkowa = static_cast&amp;lt;double*&amp;gt; (Tablica[0].Wartosc);&lt;br /&gt;    cout &lt;&lt; *ZmiennoPrzecinkowa;&lt;br /&gt;    break;&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Prawda, że proste?&lt;br /&gt;Naturalnie, powyższą strukturę można wykorzystać dla dowolnych typów danych, włączając w to pojemniki STL'a, klasy, wskaźniki na obiekty, itd... Ile typów, tyle możliwości w skrócie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342228221192121358-1735972990392206550?l=michalmet-cpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://michalmet-cpp.blogspot.com/feeds/1735972990392206550/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5342228221192121358&amp;postID=1735972990392206550' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342228221192121358/posts/default/1735972990392206550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342228221192121358/posts/default/1735972990392206550'/><link rel='alternate' type='text/html' href='http://michalmet-cpp.blogspot.com/2008/03/wskaniki-na-co.html' title='Wskaźniki na... &quot;coś&quot;'/><author><name>Michał</name><uri>http://www.blogger.com/profile/00763948677439190388</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5342228221192121358.post-3368033222725902724</id><published>2008-03-15T11:31:00.002+01:00</published><updated>2008-03-15T12:18:27.602+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wskaźniki'/><title type='text'>Wskaźniki na funkcje</title><content type='html'>Zdarza się czasem, że potrzebujemy wykorzystać kilka funkcji w naszym programie. Jednym ze sposobów jest zaimplementowanie wielu różnych funkcji przy pomocy instrukcji sterujących (if, switch). Jednak wtedy rozmiar kodu może się drastycznie zwiększyć, tudzież czytelność kodu może zmaleć. Co wtedy robić? Z pomocą przychodzą wskaźniki. Z początku bardzo nie lubiłem wskaźników w C++, jednak pomału przyzwyczajam się do nich, mało tego, uważam, że są bardzo całkiem proste w użyciu! Tak, tak, dobrze przeczytałeś. Nie są trudne, ważne, by załapać ideę wskaźników, a potem to już pójdzie po maśle ;)&lt;br /&gt;&lt;br /&gt;No ale wróćmy do tematu. Wskaźnik na funkcję. Jak można się domyślić, jest to po prostu liczba, która wskazuje adres w pamięci, gdzie zaczyna się nasza szukana funkcja. No dobrze, ale jak to wykorzystać? Są dwa sposoby. Pierwszy polega na napisaniu dodatkowej funkcji. Jeśli nasza funkcja posiada jeden argument (zakładamy, że argumenty i wartości zwracane przez funkcję są typu &lt;code&gt;double&lt;/code&gt; - naturalnie, może to być dowolny typ):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;double funkcja(double (*wskaznik_na_funkcje)(double), double x) &lt;br /&gt;{&lt;br /&gt;  double wynik;&lt;br /&gt;  wynik = (*wskaznik_na_funkcje) (x);&lt;br /&gt;  return (wynik);&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Początek deklaracji nie powinien dziwić - typ zwracany przez naszą funkcję pomocniczą i jej nazwa. Pierwszym parametrem jest wskaźnik na naszą funkcję, wraz z listą parametrów, jakie potrzebuje ta funkcja (w naszym wypadku jest to jeden parametr). Pierwsze &lt;code&gt;double&lt;/code&gt; to oczywiście wartość zwracana przez funkcję. Drugim parametrem jest wartość liczbowa, która będzie potem parametrem wskazywanej funkcji. &lt;br /&gt;W ciele funkcji deklarujemy sobie dodatkową zmienną, w której przechowamy wynik. I najważniejsze w tym wszystkim: &lt;code&gt;wynik = (*wskaznik_na_funkcje) (x);&lt;/code&gt;. Te nawiasy są jak najbardziej potrzebne, w przeciwnym wypadku kompilator będzie to interpretować jako wskaźnik na liczbę. I teraz najważniejsze - wykorzystanie:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;double a, b;&lt;br /&gt;a = funkcja(sin, 1.74);&lt;br /&gt;b = funkcja(cos, 1.74);&lt;br /&gt;cout &lt;&lt; a &lt;&lt; "\n";&lt;br /&gt;cout &lt;&lt; b &lt;&lt; "\n";&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Innym sposobem jest wykorzystanie bezpośrednie tego wskaźnika, a mianowicie: deklarujemy najpierw zmienną wskaźnikową wraz z parametrami:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;double (*func)(double);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;A następnie musimy przypisać temu wskaźnikowi adres naszej funkcji:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;func = sin;    &lt;br /&gt;a = func(1.74);&lt;br /&gt;func = cos;&lt;br /&gt;b = func(1.74);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Wykorzystanie, jak widać, jest również proste.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Można także skorzystać z tablicy wskaźników na funkcje. &lt;br /&gt;Deklaracja tablicy wygląda tak:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;double (*funkcje[4])(double);&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Chyba nie trzeba tego tłumaczyć... Następnie przydzielamy odpowiednie wartości, np:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;funkcje[0] = sin;&lt;br /&gt;funkcje[1] = cos;&lt;br /&gt;funkcje[2] = tan;&lt;br /&gt;funkcje[3] = ctg;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;(funkcję &lt;code&gt;ctg&lt;/code&gt; zdefiniowałem jako: &lt;code&gt;pow(tan(x), -1.0)&lt;/code&gt;)&lt;br /&gt;&lt;br /&gt;I na koniec wykorzystanie:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;for (int i = 0; i &lt; 4; i ++)&lt;br /&gt;  cout &lt;&lt; funkcje[i](3.1415 / 4.0) &lt;&lt; "\n";&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Prawda, że ładniej to wygląda? ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5342228221192121358-3368033222725902724?l=michalmet-cpp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://michalmet-cpp.blogspot.com/feeds/3368033222725902724/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5342228221192121358&amp;postID=3368033222725902724' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5342228221192121358/posts/default/3368033222725902724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5342228221192121358/posts/default/3368033222725902724'/><link rel='alternate' type='text/html' href='http://michalmet-cpp.blogspot.com/2008/03/wskaniki-na-funkcje.html' title='Wskaźniki na funkcje'/><author><name>Michał</name><uri>http://www.blogger.com/profile/00763948677439190388</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
