INS, INSB, INSW, INSD

Entrada desde Port a String

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
6CINS m8, DXZOValidoValidoByte de entrada del puerto I/O especificado en DX en ubicación de memoria especificado en ES:(E)DI o RDI.1
6DINS m16, DXZOValidoValidoPalabra de entrada del puerto I/O especificado en DX en ubicación de memoria especificado en ES:(E)DI o RDI.1
6DINS m32, DXZOValidoValidoDoble palabra de entrada del puerto I/O especificado en DX en ubicación de memoria especificado en ES:(E)DI o RDI.1
6CINSBZOValidoValidoByte de entrada del puerto I/O especificado en DX en ubicación de memoria especificado con ES:(E)DI o RDI.1
6DINSWZOValidoValidoPalabra de entrada del puerto I/O especificado en DX en ubicación de memoria especificado en ES:(E)DI o RDI.1
6DINSDZOValidoValidoDoble palabra de entrada del puerto I/O especificado en DX en ubicación de memoria especificado en ES:(E)DI o RDI.1

Coste medido

Cargando las mediciones de arch-data...

Descripción

Copia los datos del puerto I/O especificados con el operando de origen (segundo operando) al operando de destino (primer operando). El operando de origen es una dirección portuaria I/O (de 0 a 65,535) que se lee en el registro DX. El operando de destino es una ubicación de memoria, cuya dirección se lee en los registros ES:DI, ES:EDI o RDI (dependiendo del atributo de tamaño de la instrucción, 16, 32 o 64, respectivamente). (El segmento ES no puede ser superado con un prefijo de anulación de segmento.) El tamaño del puerto I/O que se accede (es decir, el tamaño de la fuente y operandos de destino) es determinado por el código de operación para un puerto I/O de 8 bits o por el atributo el operando-size de la instrucción para un puerto I/O de 16 o 32 bits.

En el nivel de código de montaje se permiten dos formas de esta instrucción: la forma "explicit-operandos" y la forma "nooperands". La forma explícita-operandos (especificada con el INS mnemonic) permite que la fuente y operandos de destino se especifiquen explícitamente. Aquí, el operando de origen debe ser "DX", y el operando de destino debe ser un símbolo que indica el tamaño del puerto I/O y la dirección de destino. Esta forma explícita-operandos se proporciona para permitir la documentación; sin embargo, tenga en cuenta que la documentación proporcionada por este formulario puede ser engañosa. Es decir, el símbolo el operando de destino debe especificar el tipo correcto (tamaño) del operando (byte, palabra o palabra doble), pero no tiene que especificar la ubicación correcta. La ubicación siempre es especificada por los registros ES:(E)DI, que deben ser cargados correctamente antes de ejecutar la instrucción INS.

La forma no-operandos proporciona "formas cortas" de las versiones de byte, palabra y doble palabra de las instrucciones INS. Aquí también DX es asumido por el procesador para ser el operando de origen y ES:(E)DI se supone que es el operando de destino. El tamaño del puerto I/O se especifica con la opción de mnemonic: INSB (byte), INSW (palabra), o INSD (palabra doble).

Después de que el byte, palabra o palabra doble se transfiere del puerto I/O a la ubicación de memoria, el registro DI/EDI/RDI se aumenta o decrece automáticamente según el ajuste de la bandera DF en el registro EFLAGS. (Si la bandera DF es 0, el registro (E)DI se aumenta; si la bandera DF es 1, el registro (E)DI se decrementa.) El registro (E)DI es aumentado o decrementado por 1 para operaciones byte, por 2 para operaciones de palabras, o por 4 para operaciones de doble palabra.

Las instrucciones INS, INSB, INSW y INSD pueden ser precedidas por el prefijo REP para la entrada de bloque de bytes ECX, palabras, o palabras dobles. Ver "REP/REPE/REPZ /REPNE/REPNZ--Repeat String Operation Prefix" en el Capítulo 4 del Intel(R) 64 e IA-32 Architectures Software Developer's Manual, Volumen 2B, para una descripción del prefijo REP.

Estas instrucciones sólo son útiles para acceder a los puertos I/O ubicados en el espacio de dirección I/O del procesador. Ver el capítulo 20, "Input/Output", en el Manual de Software de Arquitecturas Intel(R) 64 e IA-32, Volumen 1, para obtener más información sobre el acceso a puertos I/O en el espacio de direcciones I/O.

En modo de 64 bits, el tamaño por defecto de la dirección es de 64 bits, el tamaño de la dirección de 32 bits se soporta utilizando el prefijo 67H. La dirección del destino de memoria es especificada por RDI o EDI. El tamaño de la dirección de 16 bits no es compatible con el modo 64-bit. El tamaño de operando no es promovido.

Estas instrucciones pueden leer desde el puerto I/O sin escribir a la ubicación de memoria si se produce una excepción o salida VM debido a la escritura (por ejemplo. #PF). Si esto sería problemático, por ejemplo, porque el puerto de I/O leído tiene efectos secundarios, el software debe asegurar la escritura a la ubicación de memoria no causa una excepción o salida VM.

Operación

IF ((PE = 1) and ((CPL > IOPL) or (VM = 1)))

    THEN (* Protected mode with CPL > IOPL or virtual-8086 mode *)

        IF (Any I/O Permission Bit for I/O port being accessed = 1)

                THEN (* I/O operation is not allowed *)
                      #GP(0);

                ELSE (* I/O operation is allowed *)
                      DEST := SRC; (* Read from I/O port *)

          FI;
    ELSE (Real Mode or Protected Mode with CPL IOPL *)

          DEST := SRC; (* Read from I/O port *)
FI;

Non-64-bit Mode:

IF (Byte transfer)

   THEN IF DF = 0

          THEN (E)DI := (E)DI + 1;
          ELSE (E)DI := (E)DI  1; FI;
    ELSE IF (Word transfer)

        THEN IF DF = 0

                THEN (E)DI := (E)DI + 2;
                ELSE (E)DI := (E)DI  2; FI;
          ELSE (* Doubleword transfer *)

             THEN IF DF = 0

                      THEN (E)DI := (E)DI + 4;
                      ELSE (E)DI := (E)DI  4; FI;
          FI;
FI;

FI64-bit Mode:

IF (Byte transfer)

   THEN IF DF = 0

          THEN (E|R)DI := (E|R)DI + 1;
          ELSE (E|R)DI := (E|R)DI  1; FI;
    ELSE IF (Word transfer)

        THEN IF DF = 0

                THEN (E)DI := (E)DI + 2;
                ELSE (E)DI := (E)DI  2; FI;
          ELSE (* Doubleword transfer *)

             THEN IF DF = 0

                      THEN (E|R)DI := (E|R)DI + 4;


                ELSE (E|R)DI := (E|R)DI  4; FI;

          FI;
FI;

Banderas afectadas

None.

Excepciones

Modo protegido
#GP(0)SiCPLes mayor que (tiene menos privilegio) el nivel de privilegios I/O (IOPL) y cualquiera de los bits de permiso I/O correspondientes enTSSpara el puerto I/O que se accede es 1. Si el destino se encuentra en un segmento no escrito.operando de memoriase da una dirección eficaz en los segmentos de ES.#PF(fault-code)Siun fallo de paginaocurre.
#AC(0)Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada mientras que el nivel de privilegio actual es 3.
#UDSi se utiliza el prefijo LOCK.
Modo real
#GPSi un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS.
#SSSi un operando de memoria dirección efectiva está fuera del límite del segmento SS.
#UDSi se utiliza el prefijo LOCK.
Modo virtual-8086
#GP(0)Si alguno de los bits de permiso I/O en el TSS para el puerto I/O que se accede es 1. #PF(fault-code) Si un fallo de pagina ocurre.
#AC(0)Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada.
#UDSi se utiliza el prefijo LOCK.
Modo de compatibilidad
Las mismas excepciones que en modo protegido.
Modo de 64 bits
#SS(0)Si una dirección de memoria que hace referencia al segmento SS está en forma no canónica.
#GP(0)Si el CPL es mayor que (tiene menos privilegio) el nivel de privilegios I/O (IOPL) y cualquiera de los bits de permiso I/O correspondientes en TSS para el puerto I/O que se accede es 1. Si la dirección de memoria está en forma no canónica. #PF(fault-code) Si un fallo de pagina ocurre.
#AC(0)Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada mientras que el nivel de privilegio actual es 3.
#UDSi se utiliza el prefijo LOCK.

Fuentes