¿Qué instrucciones x86 toman dos (o más) operandos de memoria?

Resuelto Evan Carroll asked hace 5 años • 1 respuestas

Pensé que había cero. Pero veo aquí

Las instrucciones con dos operandos de memoria son extremadamente raras.

No encuentro nada que explique qué instrucciones, aunque raras, existen. ¿Cuáles son las excepciones?

Evan Carroll avatar Sep 30 '18 07:09 Evan Carroll
Aceptado

No puedo encontrar nada que explique la rareza.

Una instrucción x86 puede tener como máximo un ModR/M + SIB + disp0/8/32. Entonces no hay instrucciones con dos operandos de memoria explícitos .

Todas las instrucciones de memoria-memoria x86 tienen al menos un operando de memoria implícito cuya ubicación está integrada en el código de operación, como pushel que accede a la pila, o las instrucciones de cadena movsy cmps.

¿Cuáles son las excepciones?

Lo usaré [mem]para indicar un modo de direccionamiento ModR/M que puede ser [rdi], [RIP+whatever], [ebx+eax*4+1234]o lo que quieras.

  • push [mem]: lee [mem], escribe implícitamente [rsp](después de actualizar rsp).
  • pop [mem]
  • call [mem]: lee un nuevo RIP de [mem], inserta una dirección de retorno en la pila.
  • movsb/w/d/q: lee DS:(E)SI, escribe ES:(E)DI (o en modo de 64 bits RSI y RDI). Ambos están implícitos; sólo el DSregistro del segmento es anulable. Utilizable con rep.
  • cmpsb/w/d/q: lee DS:(E)SIy ES:(E)DI (o en modo de 64 bits RSI y RDI). Ambos están implícitos; sólo el DSregistro del segmento es anulable. Utilizable con repe/ repne.

  • MPX bndstx mib, bnd: "Almacena los límites en bnd y el valor del puntero en el registro de índice de mib en una entrada de tabla vinculada (BTE) con traducción de direcciones utilizando la base de mib". La sección Operación muestra una carga y un almacén, pero no sé lo suficiente sobre MPX para asimilarlo.

  • movdir64b r16/r32/r64, m512. Tiene su propia característica, disponible en el próximo Tremont (sucesor de Goldmont Plus Atom). Mueve 64 bytes como almacenamiento directo (WC) con atomicidad de escritura de 64 bytes desde la dirección de memoria de origen a la dirección de memoria de destino. El operando de destino es (atómico alineado) es: /rde ModRM, la fuente es (no atómica no alineada) de /mModRM.

    Utiliza combinación de escritura para la tienda, consulte la descripción. Es la primera vez que un proveedor de CPU x86 garantiza una atomicidad superior a 8 bytes fuera de lock cmpxchg16b. Pero desafortunadamente, en realidad no es excelente para subprocesos múltiples porque obliga a un comportamiento de desalojo/omisión de caché similar al de NT, por lo que otros núcleos tendrán que leerlo desde DRAM en lugar de desde un caché externo compartido.

Las instrucciones de recolección AVX2 y dispersión AVX512 son discutibles. Obviamente realizan múltiples cargas/almacenamiento, pero todos los punteros provienen de un vector SIMD (y una base escalar).

No cuento instrucciones como pusha, fldenv, xsaveopt, ireto entercon nivel de anidamiento > 1 que realizan múltiples almacenamientos o cargas en un bloque contiguo.

Tampoco cuento las instrucciones de cadena ins/ outs, porque copian la memoria hacia/desde el espacio de E/S. El espacio de E/S no es memoria.

No miré las instrucciones VMX o SGX en http://felixcloutier.com/x86/index.html , solo la lista principal. No creo que me haya perdido ninguno, pero ciertamente podría haberlo hecho.

Peter Cordes avatar Sep 30 '2018 05:09 Peter Cordes