2010-12-15 15 views
5

Şu anda bazı C kodlarını sökerek ASM'yi öğreniyorum. Bir şey ilgimi gcc derleyici açıkça anlamsız buMov% rax,% rax'ın amacı nedir?

movq %rax,%rax 

gibi kod üretir olmasıdır. Peki bunu yapmanın amacı nedir?

Boru hattını iyileştirmek için birkaç CPU döngüsünü harcamak için kullanılıp kullanılmadığını merak ediyorum.

İpucunuz için teşekkür ederiz!

+0

Boru hattını iyileştirmek için kullanılmaz. Tüm x86 işlemcilerinin (tarihsel nedenlerden dolayı), bu tür tehlikeleri gerektiğinde durdurarak çözen donanımları vardır. Sadece RISC'ler, basitleştirici, bunun için derleyici desteğine ihtiyaç duyarlar. – ruslik

+1

@ruslik: Bir durak kendiliğinden bir tehlikedir. –

cevap

10

Temel olarak no-op, evet.

Derleyici bunu yapar, çünkü 4 baytlık bir sınırda hizalanmış bir adrese dallanma, hizalanmamış bir adrese dallanmadan daha hızlıdır. Yani bir döngünüz varsa, derleyici, hizalama elde etmek için hemen başlamadan önce "dolgu" ekleyecektir.

+0

Makul bir açıklama gibi görünüyor. Ama neden NOP talimatı kullanmıyorsunuz? – xis

+4

x86, "dedicated" nop komutuna sahip değil. 1 baytlık NOP komutu, tam opkodu, xchg% eax,% eax' ve diğer nop boyutlarına benzer şekilde içerir. Derleyici, ihtiyaç duyduğu dolgu miktarı için doğru boyutta bir op kullanılmaz. –

+5

Standart bir NOP komutu 1 bayt uzun olduğundan ve derleyicinin dolgu için 2 bayta ihtiyacı vardır. Her ikisi de NOP olsa bile 1 komut 2'den daha hızlıdır. Örneğin, ortak 3 bayt NOP 'lea edi, [edi + 0]' – ruslik