{"id":1404,"date":"2019-03-31T11:00:50","date_gmt":"2019-03-31T09:00:50","guid":{"rendered":"https:\/\/www.kompikownia.pl\/?p=1404"},"modified":"2019-03-31T11:01:15","modified_gmt":"2019-03-31T09:01:15","slug":"sciezka-danych-w-cpu-zasada-dzialania","status":"publish","type":"post","link":"https:\/\/www.kompikownia.pl\/index.php\/2019\/03\/31\/sciezka-danych-w-cpu-zasada-dzialania\/","title":{"rendered":"\u015acie\u017cka danych w CPU &#8211; zasada dzia\u0142ania"},"content":{"rendered":"<span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania:<\/span> <span class=\"rt-time\">6<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span>\n<p>Chcia\u0142by\u015b pewnie zaprojektowa\u0107 w\u0142asny procesor, kt\u00f3ry dzia\u0142a\u0142by tak jak prawdziwy, prawda? Nie jest to tak trudne i abstrakcyjne, jakby ci si\u0119 wydawa\u0142o. Wystarczy rozumie\u0107 zasad\u0119 dzia\u0142ania podstawowych uk\u0142ad\u00f3w z kt\u00f3rych zbudowany jest ten uk\u0142ad. Spokojnie, wszystko po kolei om\u00f3wimy. Dzisiaj zajmiemy si\u0119 jedn\u0105 z dw\u00f3ch g\u0142\u00f3wnych cz\u0119\u015bci CPU &#8211; modu\u0142em \u015bcie\u017cki danych. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Czym jest \u015bcie\u017cka danych?<\/h2>\n\n\n\n<p>Procesor jest przeznaczony do jakiego\u015b celu &#8211; zwykle wykonywania oblicze\u0144. Mikroprocesor musi by\u0107 te\u017c uniwersalny, powinien m\u00f3c realizowa\u0107 dowolne kombinacje rozkaz\u00f3w, jakie wprowadzi na jego wej\u015bcie programista. Za dekodowanie rozkaz\u00f3w i sterowanie &#8222;ca\u0142ym procesorem&#8221; odpowiada modu\u0142 kontrolera. Natomiast modu\u0142 \u015bcie\u017cki danych odpowiada za wykonywanie faktycznych oblicze\u0144. Wewn\u0105trz \u015bcie\u017cki danych znajduj\u0105 si\u0119 rejestry, w kt\u00f3rych przechowywane s\u0105 wyniki oblicze\u0144, dane wej\u015bciowe, tymczasowe i cokolwiek innego, czego za\u017cyczy sobie programista. Znajduj\u0105 si\u0119 tu tak\u017ce sumatory, jednostki arytmetyczno-logiczne kt\u00f3re s\u0142u\u017c\u0105 do przeprowadzania r\u00f3\u017cnych operacji i dzia\u0142a\u0144. Ostatnim wa\u017cnym komponentem s\u0105 multipleksery, kt\u00f3re steruj\u0105 &#8222;przep\u0142ywem&#8221; informacji i zarz\u0105dzaj\u0105 co gdzie powinno trafi\u0107. <\/p>\n\n\n\n<p> W normalnym CPU \u015bcie\u017cka danych jest sprz\u0119\u017cona z kontrolerem i pozosta\u0142ymi elementami procesora. My nie chcemy komplikowa\u0107 sprawy. W tym artykule b\u0119dziemy zajmowali si\u0119 wy\u0142\u0105cznie \u015bcie\u017ck\u0105 danych.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak dzia\u0142a procesor\/\u015bcie\u017cka danych?<\/h2>\n\n\n\n<p>U\u017cywasz komputera na co dzie\u0144, a wi\u0119c wiesz \u017ce procesor posiada co\u015b takiego jak taktowanie. Jest to, najpro\u015bciej spraw\u0119 ujmuj\u0105c &#8211; zmiana warto\u015bci sygna\u0142u na przeciwny co pewien czas. CPU jest uk\u0142adem synchronicznym, a wi\u0119c ca\u0142a jego praca zale\u017cy w\u0142a\u015bnie od zegara. Kiedy chcemy wysterowa\u0107 jaki\u015b uk\u0142ad, np.: zapisa\u0107 co\u015b do rejestru, to wykonujemy to &#8222;w pewnym okienku&#8221;, kt\u00f3rego miejsce okre\u015blone jest przez sygna\u0142 zegarowy. Wykonywanie akcji przez r\u00f3\u017cne komponenty CPU mo\u017ce odbywa\u0107 si\u0119 w dw\u00f3ch r\u00f3\u017cnych momentach: albo przy narastaj\u0105cym albo przy opadaj\u0105cym zboczu zegara. My nie musimy by\u0107 a\u017c tacy dok\u0142adni. Wystarczy wiedzie\u0107, \u017ce na wykonanie ka\u017cdej operacji, takiej jak wysterowanie multipleksera czy zapisanie wynik\u00f3w do rejestru potrzebujemy co najmniej jednego cyklu zegara. Cykle oznaczamy za pomoc\u0105 literki t i cyfry oznaczaj\u0105cej numer analizowanego cyklu. Np.: t0 zawiera wszystkie instrukcje, kt\u00f3re wykonywane s\u0105 przy pierwszym takcie zegara. t1 &#8211; przy drugim. I tak dalej &#8230; <\/p>\n\n\n\n<p>Pozna\u0142e\u015b ju\u017c podstawowe rozkazy w procesorze x86, takie jak mov. (Je\u015bli nie, <a href=\"https:\/\/www.kompikownia.pl\/index.php\/2018\/03\/11\/asembler-rtdsc-i-wlasny-benchmark-architektura-systemow-komputerowych\/\">zapraszam tuta<\/a>j) Ot\u00f3\u017c wykonanie tych rozkaz\u00f3w przez \u015bcie\u017ck\u0119 danych wcale nie jest proste. Ka\u017cdy z nich sk\u0142ada si\u0119 z jednej lub wi\u0119kszej ilo\u015bci <strong>mikrooperacji.<\/strong> To one s\u0105 sk\u0142adow\u0105 rozkazu. Wydaj\u0105c rozkaz mov EAX,100 tak naprawd\u0119 ka\u017cemy kontrolerowi &#8222;tak wysterowa\u0107&#8221; \u015bcie\u017ck\u0119 danych za pomoc\u0105 powi\u0105zanych z rokazem mov mikrooperacji, aby warto\u015b\u0107 100 zosta\u0142a zapisana do rejestru EAX. <\/p>\n\n\n\n<p>Nauczymy si\u0119 tworzy\u0107 mikrooperacje, a wi\u0119c niejako &#8222;zast\u0105pimy&#8221; modu\u0142 kontrolera CPU. Dowiemy si\u0119, jak wykonywanie rozkaz\u00f3w wygl\u0105da &#8222;od \u015brodka&#8221;. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Z jakich komponent\u00f3w korzysta \u015bcie\u017cka danych?<\/h2>\n\n\n\n<p>Oczywi\u015bcie, z tranzystor\u00f3w &#8230; A tak na powa\u017cnie, to mamy kilka komponent\u00f3w kt\u00f3re musisz zna\u0107 i rozumie\u0107 zasad\u0119 ich dzia\u0142ania. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rejestr<\/h3>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"99\" height=\"92\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/03\/image-11.png\" alt=\"Symbol rejestru\" class=\"wp-image-1406\"\/><\/figure><\/div>\n\n\n\n<p>Rejestr przechowuje pojedyncz\u0105 liczb\u0119. Komponent ten mo\u017ce mie\u0107 r\u00f3\u017cn\u0105 pojemno\u015b\u0107: 8, 16 lub 32 bity. W projektach na studiach najcz\u0119\u015bciej b\u0119dziesz u\u017cywa\u0142 8 i 16 bitowych rejestr\u00f3w. Rozmiar rejestru zale\u017cy od architektury procesora. Je\u015bli tworzymy procesor 8 bitowy, stosujemy rejestry 8 bitowe. <\/p>\n\n\n\n<p>Ale jest wyj\u0105tek od tej regu\u0142y. Je\u015bli w za\u0142o\u017ceniach zosta\u0142o powiedziane: zastosuj rejestry 16 bitowe, to stosujemy 16 bitowe bez wzgl\u0119du na wszystkie inne czynniki.<\/p>\n\n\n\n<p>Zauwa\u017cy\u0142e\u015b pewnie patrz\u0105c na symbol, \u017ce rejestr posiada wej\u015bcie, wyj\u015bcie oraz n\u00f3\u017ck\u0119 oznaczon\u0105 symbolem LD. Musisz wiedzie\u0107, \u017ce to co podamy na wej\u015bcie rejestru zostanie do niego zapisane dopiero wtedy, kiedy na pin LD podamy jedynk\u0119. Nowy wynik zostanie podany na wyj\u015bcie rejestru dopiero w <strong>nast\u0119pnym cyklu zegara<\/strong>. Musimy o tym pami\u0119ta\u0107 przy sterowaniu. Je\u015bli mamy potrzeb\u0119 zapisania czego\u015b do rejestru, to kolejne operacje nale\u017cy przenie\u015b\u0107 do nast\u0119pnego cyklu zegara.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Multiplekser<\/h3>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"98\" height=\"145\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/03\/image-12.png\" alt=\"symbol multipleksera\" class=\"wp-image-1408\"\/><\/figure><\/div>\n\n\n\n<p>Jaka jest rola multipleksera? Posiada on par\u0119 wej\u015b\u0107 i jedno wyj\u015bcie. Pozwala on na &#8222;przekazanie&#8221; jednego z wej\u015b\u0107 na wyj\u015bcie. W \u015bcie\u017cce danych mo\u017ce pe\u0142ni\u0107 wiele funkcji i jest bardzo cz\u0119sto wyst\u0119puj\u0105cym komponentem. <\/p>\n\n\n\n<p>Wej\u015bcia numerowane s\u0105 od zera, patrz\u0105c na g\u00f3r\u0119 multipleksera. Czyli pierwsze wej\u015bcie od g\u00f3ry ma numer 0, drugie 1, trzecie 2 itd. Je\u015bli chcemy &#8222;przepisa\u0107&#8221; warto\u015b\u0107 drugiego wej\u015bcia multipleksera na jego wyj\u015bcie, ustawiamy warto\u015b\u0107 pinu ADR na 1. Je\u015bli posiadaliby\u015bmy multiplekser czterowej\u015bciowy i chcieliby\u015bmy przekaza\u0107 ostatnie wej\u015bcie na wyj\u015bcie multipleksera, wtedy ustawiliby\u015bmy pin ADR na warto\u015b\u0107 3. <\/p>\n\n\n\n<p style=\"background-color:#fbff04\" class=\"has-background\"><strong>Pami\u0119taj:<\/strong> multiplekser dzia\u0142a <strong>natychmiastowo.<\/strong> Oznacza to, \u017ce w przeciwie\u0144stwie do rejestru mo\u017cesz sterowa\u0107 kilkoma multiplekserami w jednym cyklu zegarowym. <\/p>\n\n\n\n<p>Multiplekser ma brata nazywaj\u0105cego si\u0119 demultiplekserem. Zasada dzia\u0142ania demultipleksera jest bardzo podobna. Komponent ten dzia\u0142a &#8222;niejako&#8221; na odwr\u00f3t. Demultiplekser posiada tylko jedno wej\u015bcie i kilka wyj\u015b\u0107. Jego zadaniem jest przepisanie tego wej\u015bcia na konkretne wyj\u015bcie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sumator<\/h3>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"84\" height=\"102\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/03\/image-13.png\" alt=\"symbol sumatora\" class=\"wp-image-1409\"\/><\/figure><\/div>\n\n\n\n<p>Sumator jest najprostszym uk\u0142adem. Jego celem jest dodanie dw\u00f3ch liczb do siebie. Jest uk\u0142adem asynchronicznym, a wi\u0119c dzia\u0142a natychmiastowo. Posiada <strong>zawsze<\/strong> dwa wej\u015bcia i <strong>zawsze <\/strong>jedno wyj\u015bcie. Nie musimy nic sterowa\u0107. Po prostu to co wstawimy na wej\u015bcie zostanie zsumowane i od razu przekazane na wyj\u015bcie. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Najprostsza \u015bcie\u017cka danych i jej om\u00f3wienie<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Przyk\u0142ad pierwszy (A=WE)<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"950\" height=\"225\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/03\/image-25.png\" alt=\"\" class=\"wp-image-1452\"\/><\/figure>\n\n\n\n<p>Na schemacie powy\u017cej widzimy najprostsz\u0105 mo\u017cliw\u0105 \u015bcie\u017ck\u0119 danych. (Rysunek zosta\u0142 pobrany z instrukcji dost\u0119pnej pod <a href=\"http:\/\/hector.tu.kielce.pl\/przedmioty\/ask-lab\/ask-lab-05.html\">tym<\/a> adresem). <\/p>\n\n\n\n<p>Za\u0142\u00f3\u017cmy, \u017ce chcemy wykona\u0107 operacj\u0119 A=WE. Co to znaczy? Oznacza to, \u017ce chcemy zapisa\u0107 to co zosta\u0142o podane na wej\u015bciu uk\u0142adu do rejestru A. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"950\" height=\"225\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/03\/image-15.png\" alt=\"\" class=\"wp-image-1411\"\/><\/figure>\n\n\n\n<p>Jeste\u015bmy w bloczku oznaczonym literami WE. Musimy przedosta\u0107 si\u0119 do rejestru A. Jak\u0105 \u015bcie\u017ck\u0105 mo\u017cemy p\u00f3j\u015b\u0107? G\u00f3rna, biegn\u0105ca przez ADR3 odpada, gdy\u017c mo\u017cemy ni\u0105 dotrze\u0107 tylko do sumatora. Pozostaje dolna, biegn\u0105ca przez multiplekser ADR1 i demultiplekser ADR2. Konstruujemy pierwszy cykl. <\/p>\n\n\n\n<p>Multiplekser ADR1 powinien przekaza\u0107 swoje pierwsze wej\u015bcie na wyj\u015bcie. Ustawiamy ADR1 na 0. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"950\" height=\"225\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/03\/image-16.png\" alt=\"\" class=\"wp-image-1412\"\/><\/figure>\n\n\n\n<p>Znajdujemy si\u0119 teraz pomi\u0119dzy ADR1 i ADR2. Co musimy zrobi\u0107 aby dosta\u0107 si\u0119 do rejestru A? Jeste\u015bmy ju\u017c bardzo blisko. <\/p>\n\n\n\n<p>Demultiplekser ADR2 musi przekaza\u0107 swoje wej\u015bcie na pierwsze wyj\u015bcie, aby\u015bmy trafili do rejestru A. Ustawiamy wi\u0119c ADR2 na 0. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"950\" height=\"225\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/03\/image-17.png\" alt=\"\" class=\"wp-image-1413\"\/><\/figure>\n\n\n\n<p>To jeszcze nie koniec. Musimy zapisa\u0107 to co trafi\u0142o na wej\u015bcie rejestru A. Mo\u017cemy to zrobi\u0107 ustawiaj\u0105c LDA na warto\u015b\u0107 1. <\/p>\n\n\n\n<p>Podsumujmy nasze rozwa\u017cania. Zapiszmy kroki kt\u00f3re poczynili\u015bmy wy\u017cej w postaci cykli: <br>t0: ADR1=0, ADR2=0<br>t1: LDA=1<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Przyk\u0142ad drugi (B=B+WE)<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"http:\/\/hector.tu.kielce.pl\/przedmioty\/ask-lab\/ask-lab-03_01.gif\" alt=\"\u015acie\u017cka danych\"\/><\/figure>\n\n\n\n<p>Wykonamy teraz nieco trudniejsze zadanie. Spr\u00f3bujemy do rejestru B zapisa\u0107 sum\u0119 warto\u015bci zapisanej w rejestrze B i warto\u015bci podanej przez wej\u015bcie WE. <\/p>\n\n\n\n<p>Pierwszy cel kt\u00f3ry znajduje si\u0119 na horyzoncie to dotarcie do sumatora. Jak\u0105 drog\u0119 mo\u017cemy obra\u0107? <\/p>\n\n\n\n<p>Pierwsz\u0105 przeszkod\u0105 jest multiplekser ADR3. Musimy ustawi\u0107 ADR3 na zero, gdy\u017c WE znajduje si\u0119 na pierwszym wej\u015bciu multipleksera. Warto\u015b\u0107 z multipleksera trafia do sumatora. <\/p>\n\n\n\n<p>Warto\u015b\u0107 z rejestru B trafia bezpo\u015brednio do sumatora. Nie musimy nic robi\u0107. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"950\" height=\"225\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/03\/image-19.png\" alt=\"\" class=\"wp-image-1425\"\/><\/figure>\n\n\n\n<p>A wi\u0119c t0: ADR3=0. Dotarli\u015bmy do sumatora, kt\u00f3ry zsumowa\u0142 nam te dwie warto\u015bci. Znajdujemy si\u0119 w bloczku Rwy. Rwy jest te\u017c rejestrem, kt\u00f3ry zwany jest <strong>rejestrem buforowym.<\/strong> Zapobiega on <strong>p\u0119tli asynchronicznej.<\/strong> Co to jest? Dowiesz si\u0119 niebawem, kiedy b\u0119dziemy projektowali takie uk\u0142ady. <\/p>\n\n\n\n<p>Tymczasem musimy przej\u015b\u0107 przez ten rejestr. Rejestr jak rejestr, musimy ustawi\u0107 jego pin LD na 1. Pami\u0119tamy, \u017ce rejestry powinni\u015bmy ustawia\u0107 w oddzielnych cyklach. <\/p>\n\n\n\n<p>t1: LDRwy=1<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"950\" height=\"225\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/03\/image-23.png\" alt=\"\" class=\"wp-image-1429\"\/><\/figure>\n\n\n\n<p>Tworzymy cykl t2. Dotarli\u015bmy do ADR1, tylko tym razem wchodzimy do niego dolnym pinem. Wnioskujemy, \u017ce musimy ustawi\u0107 jego warto\u015b\u0107 na 1. ADR2 tak\u017ce musimy ustawi\u0107 na jeden, gdy\u017c drugi, dolny pin jest po\u0142\u0105czony z rejestrem B, do kt\u00f3rego powinni\u015bmy zapisa\u0107 wynik. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"950\" height=\"225\" src=\"https:\/\/www.kompikownia.pl\/wp-content\/uploads\/2019\/03\/image-24.png\" alt=\"\" class=\"wp-image-1430\"\/><\/figure>\n\n\n\n<p>Viola: Dotarli\u015bmy do celu. Ostatni cykl: t3, b\u0119dzie zawiera\u0142 tylko jedn\u0105 instrukcj\u0119: LDB=1. Potwierdzamy, \u017ce chcemy zapisa\u0107 do tego rejestru to co do niego doprowadzili\u015bmy. <\/p>\n\n\n\n<p>Podsumujmy nasze cykle:<br>t0: ADR3=0<br>t1: LDRwy=1<br>t2: ADR1=1, ADR2=1<br>t3: LDB=1<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zadanie domowe<\/h2>\n\n\n\n<p>Rozumiesz ju\u017c jak dzia\u0142a \u015bcie\u017cka danych, prawda? Dla prze\u0107wiczenia mo\u017cesz wymy\u015bli\u0107 sobie inne rozkazy i spr\u00f3bowa\u0107 zaprojektowa\u0107 mikrooperacje do nich. Poni\u017cej podaj\u0119 kilka pomys\u0142\u00f3w: <br>1. A=WE+B<br>2. WY=A+B<br>3. WY=A<br>4. WY=B<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumowuj\u0105c<\/h2>\n\n\n\n<p>Dowiedzieli\u015bmy si\u0119 jak dzia\u0142a \u015bcie\u017cka danych. Nauczyli\u015bmy si\u0119 tak\u017ce jak napisa\u0107 podstawowe mikrooperacje. W nast\u0119pnym artykule przedstawi\u0119 proces projektowania prostej \u015bcie\u017cki danych.<\/p>\n\n\n\n<p>Chcesz by\u0107 na bie\u017c\u0105co z moimi artyku\u0142ami, prawda? Kliknij wi\u0119c ten czerwono-bia\u0142y dzwoneczek w lewym dolnym rogu ekranu. B\u0119dziesz dzi\u0119ki temu otrzymywa\u0142 powiadomienia o nowych wpisach i artyku\u0142ach. <\/p>\n\n\n\n<p>Je\u015bli zauwa\u017cy\u0142e\u015b jaki\u015b b\u0142\u0105d, masz jakie\u015b uwagi &#8211; \u015bmia\u0142o: pisz. Jestem otwarty na wszelk\u0105 krytyk\u0119. <\/p>\n\n\n\n<p><br><\/p>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Czas czytania:<\/span> <span class=\"rt-time\">6<\/span> <span class=\"rt-label rt-postfix\">minut<\/span><\/span> Chcia\u0142by\u015b pewnie zaprojektowa\u0107 w\u0142asny procesor, kt\u00f3ry dzia\u0142a\u0142by tak jak prawdziwy, prawda? Nie jest to tak trudne i abstrakcyjne, jakby ci si\u0119 wydawa\u0142o. Wystarczy rozumie\u0107 zasad\u0119 dzia\u0142ania podstawowych uk\u0142ad\u00f3w z kt\u00f3rych &#8230;<\/p>\n","protected":false},"author":1,"featured_media":1452,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[23],"tags":[],"_links":{"self":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/1404"}],"collection":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1404"}],"version-history":[{"count":39,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/1404\/revisions"}],"predecessor-version":[{"id":1462,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/posts\/1404\/revisions\/1462"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/media\/1452"}],"wp:attachment":[{"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kompikownia.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}