"nop; jmp corto" frente a "jmp corto; nop"

"nop; jmp corto" frente a "jmp corto; nop"

Bien, primero déjame aclarar esto: no se trata de microoptimización.

Pero sé que en los cargadores de arranque de la partición, muchos usan la jmp short; nopcodificación. Pero tengo entendido que cuanto menos "salta" un jmp :) menos ciclos le toma al procesador completarse, y algunos procesadores ven el 0x90y simplemente lo omiten sin evaluarlo.

Respuesta1

Tal vez quieras echar un vistazo aManuales para desarrolladores de software de arquitecturas Intel 64 e IA-32, son un gran recurso para comprender la arquitectura x86 desde el punto de vista de un programador (suponiendo que ya se sienta cómodo con el ensamblaje).

[...] tengo entendido que cuanto menos "salta" un jmp :) menos ciclos le toma al procesador completarse

Es necesario diferenciar entre saltos cercanos y lejanos. Los saltos cercanos simplemente suman (o restan mediante matemáticas en complemento a 2) un desplazamiento al puntero de instrucción (IP), o recargan el desplazamiento de IP del segmento de código actual (CS). Los saltos cercanos a menudo pueden almacenar el desplazamiento en la palabra de instrucción misma o en un registro, por lo que la instrucción de salto completa se puede recuperar en un ciclo.

Los saltos lejanos almacenan la nueva dirección real del puntero de instrucción en elpróximopalabra, o en una ubicación de memoria, por lo que esto requiere una búsqueda adicional y, por lo tanto, lleva más tiempo. En x86 y x86-64, puedesnosalto lejano a una ubicación contenida en un registro (debe ser la siguiente palabra de instrucción o en una ubicación en la memoria).

y algunos procesadores ven el 0x90 y simplemente lo omiten sin evaluarlo.

Sí, esa es la definición de lo que NOPse supone que debe hacer una instrucción. La CPU todavía tiene que recuperar el 0x90código de operación, pero la evaluación no hace nada esencial.

información relacionada