Ovaj kod je primer korišćenja instrukcije lea (Load Effective Address) za brzo izračunavanje izraza umnožavanja i sabiranja u jednom koraku, umesto korišćenja standardnih instrukcija poput imul ili add.

lea rax, [rdi + rdi*8]
efikasno računa izraz oblika:

rax = rdi + (rdi * 8)

što se često koristi kao primer optimizacije koda.
Zašto koristiti lea:
Brzina izvršavanja:
Instrukcija lea je brža od pojedinačnih instrukcija množenja i sabiranja.

Optimizacija:
Koristi se često za množenje sa manjim konstantama kao što su 3, 5, 9, i sl. jer je množenje u CPU sporije od sabiranja i pomeranja.

Adresna aritmetika (pointer arithmetic):
Originalna namena instrukcije je računanje efektivne memorijske adrese, ali se često koristi kao trik za brzo množenje i sabiranje.

Prevesti sa:
gcc -no-pie 1.s -o program

Opcija -no-pie pri kompajliranju pomoću GCC-a označava:

1. Šta znači PIE?
PIE (Position Independent Executable) je izvršna datoteka koja može biti učitana u bilo koji memorijski prostor. To je sigurnosna mera koja sprečava napade zasnovane na poznatoj lokaciji programa u memoriji.

PIE je od novijih verzija GCC-a podrazumevano uključen zbog sigurnosti.

2. Zašto onda koristimo -no-pie?
Kada pišemo programe u čistom assembly jeziku (kao što smo upravo uradili), kompajliranje sa standardnom opcijom -pie može uzrokovati greške poput:

relocation error
undefined reference
greške pri linkovanju i izvršavanju, jer assembly kod često nije pisan tako da bude nezavisan od pozicije u memoriji.
Korišćenjem -no-pie opcije, kažemo kompajleru i linkeru da želimo klasičnu izvršnu datoteku sa fiksnom adresom, kakva se tradicionalno koristila.

Ukratko:
Opcija -no-pie je neophodna za prevod čistog assembly koda jer on obično nije napisan kao "position-independent". Bez nje ćeš najčešće imati problema pri kompajliranju ili pokretanju programa.


