Portál AbcLinuxu, 10. května 2024 20:39


Dotaz: Asm instrukce LEA

17.9.2009 14:23 kralyk z abclinuxu | skóre: 29 | blog:
Asm instrukce LEA
Přečteno: 618×
Odpovědět | Admin
Ahoj,
dneska jen takovou drobnost (snad)...
Narazil jsem v jednom programu na řádek
   8DA424 00000000    LEA ESP, DWORD PTR SS:[ESP]
A není mi moc jasný, k čemu to tam je. Jestli dobře chápu instrukci LEA, tak to dělá to samý co mov esp, esp, tudíž by to bylo úplně nanic, ale to je mi divný...

Co ten řádek teda ve skutečnosti dělá?
What Big Oil knew about climate change

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

17.9.2009 14:54 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: Asm instrukce LEA
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pravdepodobne je tam tá funkcia len na zarovnanie nasledujúcej (alebo až o pár inštrukcií ďalšej) inštrukcie na nejakú adresu (pri tak dlhej inštrukcii by som to typoval na zarovnávanie adresy na násobok 16) a samotná inštrukcia zmysel nemá (keďže sa pravdepodobne vôbec nevykonáva).
17.9.2009 15:00 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Asm instrukce LEA
Aha, jj je to zarovnaný na 16, to bude ono. Dík za vysvětlení.
Ale jo, vykonává se, je uprostřed jedný subroutine, která se určitě vykonává, ale tak vono to bylo kompilovaný buhvíčím, mám dojem že msvc, takže možný je všecko :-D
Bilbo avatar 17.9.2009 15:36 Bilbo | skóre: 29
Rozbalit Rozbalit vše Re: Asm instrukce LEA
Na zarovnavani se muzou pouzivat ruzne instrukce ktere nic nedelaji, casto se pouzije co nejmene instrukci aby presne zaplacly danou delku a zaroven je procesor vyridil co nejrychleji (prohozeni registru se sebou samym, pricteni nuly - cokoliv co neskace a necte nic z pameti je vhodnym kandidatem pro takovou instrukci).

Kompilator bude mit typicky tabulku NOP instrukci pro cilovou architekturu s delkou od 1 do X bajtu...
Big brother is not watching you anymore. Big Brother is telling you how to live...
18.9.2009 03:58 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Asm instrukce LEA
Proč musí vůbec některý instrukce být zarovnaný? Nějak nemůžu nic vygooglovat tak se tážu tady...
Tak například v tomhle kusu kódu:
6FDA0326   . 8DA424 00000000     LEA ESP,DWORD PTR SS:[ESP]
6FDA032D   . 8D49 00             LEA ECX,DWORD PTR DS:[ECX]
6FDA0330   > 0FBEBD A821DE6F     MOVSX EDI,BYTE PTR SS:[EBP+6FDE21A8]
6FDA0337   . 0FBE9D A021DE6F     MOVSX EBX,BYTE PTR SS:[EBP+6FDE21A0]
První dvě instrukce evidentně zarovnávají první movsx na 16, na druhej už se ale kašle...
Je to tím, že na ten první vede jump?
18.9.2009 09:47 dark
Rozbalit Rozbalit vše Re: Asm instrukce LEA

Jo. Kdysi jsem si s tím hrál v blitjit, a zdá se mi, že tyto optimalizace jsou výhodné jen pro starší CPU, u novějších je ten rozdíl zarovnání minimální. Třeba na mém Q6600 mu to je úplně jedno.

(používá se to většinou jako optimalizace pro skoky v inner loops, všude jinde to je nezajímavé)

Bilbo avatar 19.9.2009 00:32 Bilbo | skóre: 29
Rozbalit Rozbalit vše Re: Asm instrukce LEA
Bude to asi kvuli cache. Mezi cache a pameti se casto vymenuji vetsi bloky (treba 64 bajtu, ruzni se to asi podle urovne cache a procesoru) a ne jednotlive bajty, coz znamena ze pri skoku na zarovnanou instrukci je potreba do cache natahnout jeden blok, pri nezarovnane instrukci by to mohly byt dva. Nektere CPu maji holt system rizeni cache takovy, ze tahle finta nema skoro zadny efekt (treba maji tak velky cache blok, ze se malokdy stane ze by se musely tahat dva bloky, i kdyz je instrukce nezarovnana, pripadne muzou mit nejakyu inteligentni prefetch. V obou pripadech zarovnavani ma zcela minimalni prinos k vykonu)
Big brother is not watching you anymore. Big Brother is telling you how to live...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.