2010-12-15 11 views
5

Actualmente estoy aprendiendo ASM desensamblando algunos de los códigos C. Una cosa que me interesó es que el compilador gcc genera código como este¿Cuál es el propósito de mov% rax,% rax?

movq %rax,%rax 

que obviamente no tiene sentido. Entonces, ¿cuál es el propósito de hacer eso?

Me pregunto si se usa para perder algunos ciclos de CPU para mejorar la tubería.

¡Gracias por su pista!

+0

No se utiliza para mejorar la tubería. Todos los procesadores x86 (¿por razones históricas?) Tienen hardware que resuelve dichos riesgos bloqueándolos cuando es necesario. Solo los RISC, que son más simples, necesitan soporte de compilador para eso. – ruslik

+1

@ruslik: un puesto es en sí mismo un peligro. –

Respuesta

10

Es básicamente un no-op, sí.

El compilador hace esto porque la bifurcación a una dirección alineada en un límite de 4 bytes es más rápida que la bifurcación a una dirección no alineada. Entonces, si tiene un bucle, el compilador insertará "relleno" justo antes del inicio del mismo para alinearlo.

+0

Parece una explicación razonable. Pero, ¿por qué no utilizar la instrucción NOP? – xis

+4

x86 no tiene una instrucción nop "dedicada". La instrucción NOP de 1 byte tiene el código de operación exacto como 'xchg% eax,% eax', y de manera similar para otros tamaños de nop. El compilador elige un no-op con el tamaño correcto para la cantidad de relleno que necesita. –

+5

Porque una instrucción NOP estándar tiene 1 byte de longitud, y el compilador necesita 2 bytes para el relleno. 1 instrucción es más rápido que 2, incluso si ambos son NOP. Por ejemplo, el NOP común de 3 bytes es 'lea edi, [edi + 0]' – ruslik

Cuestiones relacionadas