tutorial registers lenguaje language instruction ensamblador assembly x86

assembly - registers - lenguaje ensamblador x86



¿Qué es la "UE" en la arquitectura x86?(calcula la dirección efectiva?) (4)

"UE" es el término genérico para Unidad de ejecución. La ALU es un ejemplo de una unidad de ejecución. FADD y FMUL, es decir, el sumador o multiplicador de punto flotante, son otros ejemplos, ya que, para ese caso, son (es) la unidad de memoria, para cargas y almacenes.

Las UE relevantes para las instrucciones de la LEA son la ALU (sumar, restar, Y / O, etc.) y la AGU (Unidad de generación de direcciones). La AGU está acoplada a las tuberías de memoria, TLB, caché de datos, etc.

Una CPU Intel x86 típica cuando escribí la primera guía Codegen tenía 2 ALU, 1 tubería de carga vinculada a una AGU, una tubería de dirección de tienda vinculada a una segunda ALU y una canalización de datos de tienda. A partir de 2016, la mayoría tienen 3 o 4 ALU.

LEA es una instrucción de 3 entradas: BaseReg + IndexReg * Scale + Offset. Al igual que el modo de direccionamiento de memoria de x86, que en realidad tiene una cuarta entrada, la base de segmento, que no es parte del cálculo de LEA. 3 entradas necesariamente cuestan más que las 2 entradas necesarias para ADD.

En algunas máquinas, la ALU solo puede hacer 2 operaciones de entrada. Por lo tanto, LEA solo puede ejecutar en una AGU, específicamente la AGU utilizada para la carga (porque la ALU de la tienda no escribe un registro). Esto puede significar que no puede hacer LEA al mismo tiempo que Load, o dos LEA al mismo tiempo, mientras que puede agregar dos y una carga en el mismo ciclo.

En otras máquinas, LEA se puede hacer en una, dos o tres, de las ALU. Posiblemente en lugar de la AGU, posiblemente tan bien como la ALU. Esto demuestra más flexibilidad.

O bien, las LEA simples, por ejemplo, escala de registro + desplazamiento, se pueden hacer en las ALU, mientras que las LEA más grandes, por ejemplo, la escala breg + ireg + desplazamiento, pueden estar restringidas, o incluso dividirse en dos uops.

(Ouch: la aplicación se truncó en <<, probablemente un error de cotización HTML. Puedo arreglarlo en una PC. Ah - solucionado cambiando << a *.)

Entonces, la pregunta se reduce a: ¿qué UE (Unidad de Ejecución) maneja qué LEA? ¿La ALU o la AGU? La respuesta depende de la máquina.

El texto genérico en una guía de optimización puede simplemente decir "EU" en lugar de "AGU o ALU, según el modelo" o "lo que sea que EU sea capaz de manejar esa LEA en particular".

Leí en alguna parte que las direcciones efectivas (como en la instrucción LEA) en las instrucciones x86 son calculadas por la "UE". ¿Qué es la UE? ¿Qué está involucrado exactamente en el cálculo de una dirección efectiva?

Solo he aprendido sobre el conjunto de instrucciones MC68k (UC Boulder enseña esto primero) y no puedo encontrar una buena página web x86 a través de google = /.

¡Gracias!


Las partes internas de los procesadores dentro de una sola familia han cambiado mucho a lo largo de los años, por lo que la referencia "UE" debería aclararse con el modelo de CPU exacto. Como una analogía de su experiencia en m68k, el conjunto de instrucciones para 68000, 010, 020, 030, 040 y 060 es prácticamente el mismo pero sus internos son realmente diferentes, por lo que cualquier referencia a un nombre interno debe venir con su número de pieza.


Los propios Manuales de desarrollo de software de Intel son una buena fuente de información sobre el x86, aunque pueden ser un poco exagerados (y son más parecidos a los de una referencia que a un tutorial).

La referencia de la UE (Unidad de Ejecución) fue muy probablemente en contraste con la ALU (Unidad de Aritmética Lógica) que generalmente es la parte del procesador responsable de las instrucciones aritméticas y lógicas. Sin embargo, la UE tiene (o ha tenido) también algunas capacidades aritméticas para calcular las direcciones de memoria. La instrucción x86 LEA transmite estas capacidades al programador ensamblador.

Normalmente puede suministrar algunas direcciones de memoria bastante complejas a una instrucción x86:

sub eax, [eax + ebx*4 + 0042]

y mientras la ALU maneja la resta aritmética, la UE es responsable de generar la dirección.

Con LEA, puede usar las capacidades de generación de direcciones limitadas para otros fines:

lea ebx, [eax + ebx*4 + 0042]

Comparar con:

mul ebx, 4 add ebx, eax add ebx, 0042

"Volumen 1" en la página que he vinculado tiene una sección "3.7.5" sobre modos de direccionamiento: qué tipo de direcciones de memoria puede proporcionar a una instrucción que espera un operando de memoria (de las cuales LEA es una), lo que refleja qué tipo de aritmética de la UE (o lo que se llame la parte de la interfaz de memoria) es capaz de.

"Volumen 2" es la referencia del conjunto de instrucciones y tiene información definitiva sobre todas las instrucciones, incluida la LEA.


UE = Unidad de ejecución?

Dirección efectiva es la dirección a la que se habría accedido si la instrucción LEA hubiera sido una instrucción que realmente realizó algún tipo de acceso aritmético u otro tipo de datos. Su uso ''previsto'' es calcular el puntero resultante a partir de una operación aritmética de puntero o de indexación de matriz. Sin embargo, debido a que puede realizar una combinación de multiplicar y agregar, también se usa para optimizar algunos cálculos regulares.