domingo, 9 de octubre de 2016

Mnemónicos de Lenguaje Ensamblador

Un código mnemotécnico (o código nemotécnico), es un sistema sencillo utilizado para recordar una secuencia de datos, nombres, números, y en general para recordar listas de items que no pueden recordarse fácilmente.

El concepto de mnemotécnico fue utilizado en ensamblador para la definición de unas palabras que sustituye a un código de operación (lenguaje de máquina), las cuales fueron llamadas mnemónicos. 

Estas representan con unas cuantas letras una operación que es traducida durante el proceso de ensamblaje a código binario para que pueda ser interpretado por el procesador. La creación de estos códigos abreviados dio origen a lo que hoy conocemos como lenguaje ensamblador.

Dentro de los principales mnemónico tenemos:
MOV (transferencia)
Sintaxis: MOV dest, origen.
Transfiere datos de longitud byte o palabra del operando origen al operando destino. Pueden ser operando origen y operando destino cualquier registro o posición de memoria direccionada de las formas ya vistas, con la única condición de que origen y destino tengan la misma dimensión. Existen ciertas limitaciones, como que los registros de segmento no admiten el direccionamiento inmediato: es incorrecto MOV DS,4000h; pero no lo es por ejemplo MOV DS,AX o MOV DS,VARIABLE. 


Ejemplos:
mov ds,ax
mov bx,es:[si]
mov si,offset dato


En el último ejemplo, no se coloca en SI el valor de la variable dato sino su dirección de memoria o desplazamiento respecto al segmento de datos.
LEA (carga dirección efectiva)
Sintaxis: LEA destino, origen
Transfiere el desplazamiento del operando fuente al operando destino. Otras instrucciones pueden a continuación utilizar el registro como desplazamiento para acceder a los datos que constituyen el objetivo. El operando destino no puede ser un registro de segmento. En general, esta instrucción es equivalente a MOV destino,OFFSET fuente y de hecho los buenos ensambladores (TASM) la codifican como MOV para economizar un byte de memoria. Sin embargo, LEA es en algunos casos más potente que MOV al permitir indicar registros de índice y desplazamiento para calcular el offset:
lea dx,datos[si]
En el ejemplo de arriba, el valor depositado en DX es el offset de la etiqueta datos más el registro SI. 

Esa sola instrucción es equivalente a estas dos:
mov dx,offset datos
add dx,si


PUSH (introduce en la pila)
Sintaxis: PUSH origen
Decrementa el puntero de pila (SP) en 2 y luego transfiere la palabra especificada en el operando origen a la cima de la pila. El registro CS aquí sí se puede especificar como origen, al contrario de lo que afirman algunas publicaciones.
Ejemplo: push cs
CALL (llamada a subrutina)


Sintaxis: CALL destino
Transfiere el control del programa a un procedimiento, salvando previamente en la pila la dirección de la instrucción siguiente, para poder volver a ella una vez ejecutado el procedimiento.
 El procedimiento puede estar en el mismo segmento (tipo NEAR) o en otro segmento (tipo FAR). A su vez la llamada puede ser directa a una etiqueta (especificando el tipo de llamada NEAR -por defecto- o FAR) o indirecta, indicando la dirección donde se encuentra el puntero. 

Ejemplos: call proc1
dir dd 0f000e987h
call dword ptr dir


En el segundo ejemplo, la variable dir almacena la dirección a donde saltar. De esta última manera -conociendo su dirección- puede llamarse también a un vector de interrupción, guardando previamente los flags en la pila (PUSHF), porque la rutina de interrupción retornará (con IRET en vez de con RETF) sacándolos
DIRECTIVAS DE DEFINICIÓN DE DATOS.
* DB (definir byte), DW (definir palabra), DD (definir doble palabra), DQ (definir cuádruple palabra), DT (definir 10 bytes): sirven para declarar las variables, asignándolas un valor inicial: anno DW 1991
mes DB 12
numerazo DD 12345678h
texto DB "Hola",13,10

Se pueden definir números reales de simple precisión (4 bytes) con DD, de doble precisión (8 bytes) con DQ y «reales temporales» (10 bytes) con DT; todos ellos con el formato empleado por el coprocesador. 


Con el operando DUP pueden definirse estructuras repetitivas. Por ejemplo, para asignar 100 bytes a cero y 25 palabras de contenido indefinido (no importa lo que el ensamblador asigne): ceros DB 100 DUP (0) 
DW 25 DUP (?)

Se admiten también los anidamientos. El siguiente ejemplo crea una tabla de bytes donde se repite 50 veces la secuencia 1,2,3,7,7: tabla DB 50 DUP (1, 2, 3, 2 DUP (7))
DIRECTIVAS DE DEFINICIÓN DE SÍMBOLOS.
* EQU (EQUivalence): Asigna el valor de una expresión a un nombre simbólico fijo: olimpiadas EQU 1992

Donde olimpiadas ya no podrá cambiar de valor en todo el programa. Se trata de un operador muy flexible. Es válido hacer: edad EQU [BX+DI+8]
MOV AX,edad

* = (signo ‘=’): asigna el valor de la expresión a un nombre simbólico variable: Análogo al anterior pero con posibilidad de cambiar en el futuro. Muy usada en macros (sobre todo con REPT). num = 19
num = pepe + 1
dato = [BX+3]
dato = ES:[BP+1].






6 comentarios: