Ensamblaje - Cuerdas
Ya hemos utilizado cadenas de longitud variable en nuestros ejemplos anteriores. 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 de forma explícita utilizando 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 ;our dear string
len equ $ - msg ;length of our dear string
$ apunta al byte después del último carácter de la variable de cadena msg . Por lo tanto,$-msgda la longitud de la cuerda. También podemos escribir
msg db 'Hello, world!',0xa ;our dear string
len equ 13 ;length of our dear string
Alternativamente, puede almacenar cadenas con un carácter centinela final para delimitar una cadena en lugar de almacenar la longitud de la cadena explícitamente. 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 apuntar al origen y al 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 una palabra, se carga en el registro AX y se carga una palabra doble 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 tener 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 utilizando 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 está asociado con DS (segmento de datos) y DI siempre está asociado 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.
Instrucción básica | Operandos en | Operación Byte | Operación de palabras | Operación de palabra doble |
---|---|---|---|---|
MOVS | ES: DI, DS: SI | MOVSB | MOVSW | MOVSD |
LODS | AX, DS: SI | LODSB | LODSW | LODSD |
STOS | ES: DI, AX | STOSB | STOSW | STOSD |
CMPS | DS: SI, ES: DI | CMPSB | CMPSW | CMPSD |
SCAS | ES: DI, AX | SCASB | SCASW | SCASD |
Prefijos de repetición
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 basada en un contador colocado en el registro CX. REP ejecuta la instrucción, reduce CX en 1 y comprueba si CX es cero. Repite el procesamiento de la instrucción hasta que CX sea cero.
El indicador 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.
- Utilice 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 sea cero.
REPE o REPZ: Es repetición condicional. Repite la operación mientras la bandera de cero indica igual / cero. Se detiene cuando ZF indica que no es igual a cero o cuando CX es cero.
REPNE o REPNZ: También es repetición condicional. Repite la operación mientras la bandera de cero indica no igual / cero. Se detiene cuando ZF indica igual / cero o cuando CX se reduce a cero.