TZCNT

Cuenta el número de Trailing Zero Bits

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F3 0F BC /rTZCNT r16, r/m16AValidoValidoContar el número de cero bits de seguimiento en r/m16, resultado de retorno en r16.
F3 0F BC /rTZCNT r32, r/m32AValidoValidoContar el número de cero bits de seguimiento en r/m32, resultado de retorno en r32.
F3 REX.W 0F BC /rTZCNT r64, r/m64AValidoNo codificableContar el número de cero bits de seguimiento en r/m64, resultado de retorno en r64.

Codificacion de operandos

Cada modo es un valor de la columna Op/En de arriba. Dice en que campo de la instruccion codificada va cada operando, en el orden en que se escriben, y si la instruccion lo lee, lo escribe o ambas cosas.

A

  1. modrm.reg escriturabyte ModRM, campo reg (bits 5-3)
  2. modrm.rm lecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

Descripción

TZCNT cuenta el número de bits menos significativo cero en operando de origen (segundo operando) y devuelve el resultado en el operando de destino (primer operando). TZCNT es una extensión de la instrucción BSF. La clave diferencia entre las instrucciones TZCNT y BSF es que cuando el operando de origen es cero, TZCNT produce el tamaño de operando al operando de destino, mientras que BSF hojas el operando de destino sin modificar.

En los procesadores que no soportan TZCNT, la codificación de byte de instrucciones se ejecuta como BSF.

Operación

temp := 0
DEST := 0
DO WHILE ( (temp < OperandSize) and (SRC[ temp] = 0) )

    temp := temp +1
    DEST := DEST+ 1
OD

IF DEST = OperandSize
    CF := 1

ELSE
    CF := 0

FI

IF DEST = 0
    ZF := 1

ELSE
    ZF := 0

FI

Banderas afectadas

ZF se establece a 1 en caso de salida cero (menos significativo bit de la fuente se establece), y a 0 de lo contrario, CF se establece a 1 si la entrada fue cero y se despejó de otra manera. Las banderas de SF, PF y AF no están definidas.

Intel C/C++ compilador intrínseco

TZCNT unsigned __int32 _tzcnt_u32(unsigned __int32 src);
TZCNT unsigned __int64 _tzcnt_u64(unsigned __int64 src);

Excepciones

Modo protegido
#GP(0)Para una dirección efectiva operando de memoria ilegal en los segmentos CS, DS, ES, FS o GS. Si el registro DS, ES, FS o GS se utiliza para acceder a la memoria y contiene un selector de segmento null.
#SS(0)Para una dirección ilegal en el segmento SS. #PF (código predeterminado) Para un fallo de pagina.
#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 LOCK prefijo es usado.
Modo real
#GP(0)Si alguna parte del operando está fuera del espacio de dirección eficaz de 0 a 0FFFFH.
#SS(0)Para una dirección ilegal en el segmento SS.
#UDSi LOCK prefijo se utiliza. Excepciones de Modo Virtual 8086
#GP(0)Si alguna parte del operando está fuera del espacio de dirección eficaz de 0 a 0FFFFH.
#SS(0)Para una dirección ilegal en el segmento SS. #PF (código predeterminado) Para un fallo de pagina.
#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 LOCK prefijo es usado.
Modo de compatibilidad
Las mismas excepciones que en modo protegido.
Modo de 64 bits
#GP(0)Si la dirección de memoria está en forma no canónica.
#SS(0)Si una dirección de memoria que hace referencia al segmento SS está en forma no canónica. #PF (código predeterminado) Para un fallo de pagina.
#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 LOCK prefijo es usado.

Fuentes