¿Qué instrucciones x86 toman dos (o más) operandos de memoria?
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?
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 push
el que accede a la pila, o las instrucciones de cadena movs
y 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 actualizarrsp
).pop [mem]
call [mem]
: lee un nuevo RIP de[mem]
, inserta una dirección de retorno en la pila.movsb/w/d/q
: leeDS:(E)SI
, escribeES:(E)DI
(o en modo de 64 bits RSI y RDI). Ambos están implícitos; sólo elDS
registro del segmento es anulable. Utilizable conrep
.cmpsb/w/d/q
: leeDS:(E)SI
yES:(E)DI
(o en modo de 64 bits RSI y RDI). Ambos están implícitos; sólo elDS
registro del segmento es anulable. Utilizable conrepe
/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:
/r
de ModRM, la fuente es (no atómica no alineada) de/m
ModRM.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
, iret
o enter
con 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.