tutorial registers lenguaje language instruction ensamblador assembly x86

assembly - registers - lenguaje ensamblador x86



¿Cuál es la diferencia entre las instrucciones ADC y ADCX en ia32/ia64? (2)

Estaba buscando en el manual del desarrollador de software Intel cuando encontré la instrucción ADCX , que antes no conocía; su codificación es 66 0F 38 F6 . Parece ser casi idéntico a la instrucción ADC , entonces ¿por qué usar ADCX cuando:

  • solo es compatible con CPU modernas
  • la codificación de instrucciones requiere más espacio (4 bytes frente a 1 para ADC )

¿Hay algún otro efecto secundario, o caso especial, donde ADCX resulte ventajoso sobre ADC ? Debe haber habido alguna buena razón por la cual esto se agregó al repertorio de instrucciones.


Estas instrucciones se usan para acelerar la aritmética de enteros grandes.

Antes de estas instrucciones, agregar números grandes a menudo daba como resultado una secuencia de códigos que se veía así:

add adc adc adc adc

La parte importante aquí para tener en cuenta es que si el resultado de una adición no cabe en una palabra de máquina, la bandera de acarreo se establece y se ''transfiere'' a la siguiente palabra de máquina más alta. Todas estas instrucciones dependen unas de otras porque toman en cuenta la bandera de acarreo de adición anterior y generan un nuevo valor de bandera de acarreo después de la ejecución.

Como los procesadores x86 son capaces de ejecutar varias instrucciones a la vez, esto se convirtió en un gran cuello de botella. La cadena de dependencia simplemente imposibilitó que el procesador ejecutara cualquiera de las aritméticas en paralelo. (Para ser correctos en la práctica, encontrará una carga y almacena entre las secuencias add / adc, pero el rendimiento aún estaba limitado por la dependencia de acarreo).

Para mejorar esto, Intel agregó una segunda cadena de transporte al reinterpretar el indicador de desbordamiento.

La instrucción adc tiene dos variantes de noticias: adcx y adox

adcx es lo mismo que adc , excepto que ya no modifica el indicador OF (overflow).

adox es lo mismo que adc , pero almacena la información de transporte en el indicador OF. Tampoco modifica el carry-flag nunca más.

Como puede ver, las dos nuevas variantes de adc no se influyen mutuamente con respecto al uso de la bandera. Esto le permite ejecutar dos adiciones de enteros largos en paralelo intercalando las instrucciones y usar adcx para una secuencia y adox para la otra secuencia.


Para citar el artículo Nuevas instrucciones de soporte Aritmética de enteros grandes de Intel:

Las instrucciones adcx y adox son extensiones de la instrucción adc, diseñada para admitir dos cadenas de transporte separadas. Se definen como:

adcx dest/src1, src2 adox dest/src1, src2

Ambas instrucciones calculan la suma de src1 y src2 más un carry-in y generan un sum de salida y un carry-out. La diferencia entre estas dos instrucciones es que adcx utiliza la bandera CF para el acarreo y la realización (sin cambiar la bandera OF), mientras que la instrucción adox usa la bandera OF para el acarreo y la realización (sin cambiar la bandera CF) .

La principal ventaja de estas instrucciones sobre adc es que admiten dos cadenas de transporte independientes.