⚙️STRINGS

Las cadenas de longitud variable pueden tener tantos caracteres como sea necesario. Generalmente, especificamos la longitud de la cadena por cualquiera de las dos formas:

  • Almacenamiento explícito de la longitud de la cadena

  • Usando un personaje centinela

Podemos almacenar la longitud de la cadena explícitamente usando el símbolo de contador de ubicación $ que representa el valor actual del contador de ubicación. En el siguiente ejemplo:

msg  db  'Hello, world!',0xa
len  equ  $ - msg 

$ apunta al byte después del último carácter de la variable de cadena msg . Por lo tanto, $-msg da la longitud de la cadena. También podemos escribir

msg db 'Hello, world!',0xa 
len equ 13                 

Como alternativa, puede almacenar cadenas con un carácter centinela final para delimitar una cadena en lugar de almacenar la longitud de la cadena de forma explícita. El carácter centinela debe ser un carácter especial que no aparezca dentro de una cadena.

Por ejemplo −

message DB 'I am loving it!', 0

Instrucciones de cadena

Cada instrucción de cadena puede requerir un operando de origen, un operando de destino o ambos. Para segmentos de 32 bits, las instrucciones de cadena utilizan registros ESI y EDI para apuntar a los operandos de origen y destino, respectivamente.

Sin embargo, para segmentos de 16 bits, los registros SI y DI se utilizan para señalar el origen y el destino, respectivamente.

Hay cinco instrucciones básicas para procesar cadenas. ellos son -

  • MOVS : esta instrucción mueve 1 byte, palabra o palabra doble de datos de una ubicación de memoria a otra.

  • LODS : esta instrucción se carga desde la memoria. Si el operando es de un byte, se carga en el registro AL, si el operando es de una palabra, se carga en el registro AX y una palabra doble se carga en el registro EAX.

  • STOS : esta instrucción almacena datos del registro (AL, AX o EAX) en la memoria.

  • CMPS : esta instrucción compara dos elementos de datos en la memoria. Los datos pueden ser de un tamaño de byte, palabra o palabra doble.

  • SCAS : esta instrucción compara el contenido de un registro (AL, AX o EAX) con el contenido de un elemento en la memoria.

Cada una de las instrucciones anteriores tiene una versión de byte, palabra y palabra doble, y las instrucciones de cadena se pueden repetir usando un prefijo de repetición.

Estas instrucciones utilizan el par de registros ES:DI y DS:SI, donde los registros DI y SI contienen direcciones de compensación válidas que se refieren a bytes almacenados en la memoria. SI normalmente se asocia con DS (segmento de datos) y DI siempre se asocia con ES (segmento extra).

Los registros DS:SI (o ESI) y ES:DI (o EDI) apuntan a los operandos de origen y destino, respectivamente. Se supone que el operando de origen está en DS:SI (o ESI) y el operando de destino en ES:DI (o EDI) en la memoria.

Para direcciones de 16 bits se utilizan los registros SI y DI, y para direcciones de 32 bits se utilizan los registros ESI y EDI.

La siguiente tabla proporciona varias versiones de instrucciones de cadena y el espacio supuesto de los operandos.

Prefijos de repeticion

El prefijo REP, cuando se establece antes de una instrucción de cadena, por ejemplo, REP MOVSB, provoca la repetición de la instrucción en función de un contador colocado en el registro CX. REP ejecuta la instrucción, disminuye CX en 1 y verifica si CX es cero. Repite el procesamiento de instrucciones hasta que CX es cero.

La bandera de dirección (DF) determina la dirección de la operación.

  • Utilice CLD (Clear Direction Flag, DF = 0) para realizar la operación de izquierda a derecha.

  • Use STD (Establecer indicador de dirección, DF = 1) para realizar la operación de derecha a izquierda.

El prefijo REP también tiene las siguientes variaciones:

  • REP: Es la repetición incondicional. Repite la operación hasta que CX es cero.

  • REPE o REPZ: Es repetición condicional. Repite la operación mientras la bandera cero indica igual/cero. Se detiene cuando ZF indica distinto/cero o cuando CX es cero.

  • REPNE o REPNZ: También es repetición condicional. Repite la operación mientras la bandera cero indica no igual/cero. Se detiene cuando ZF indica igual/cero o cuando CX se decrementa a cero.

Última actualización