lunes, 10 de octubre de 2016

Mnemonicos del lenguaje ensamblador

Mnemónicos
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. No es posible, así mismo, utilizar CS como destino (es incorrecto hacer MOV CS,AX aunque pueda admitirlo algún ensamblador). Al hacer MOV hacia un registro de segmento, las interrupciones quedan inhibidas hasta después de ejecutarse la siguiente instrucción (8086/88 de 1983 y procesadores posteriores).

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

POP (extraer de la pila)
Sintaxis: POP destino
Transfiere el elemento palabra que se encuentra en lo alto de la pila (apuntado por SP) al operando destino que a de ser tipo palabra, e incrementa en dos el registro SP. La instrucción POP CS, poco útil, no funciona correctamente en los 286 y superiores.

Ejemplos:      pop     ax
pop     pepe
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. Según la llamada sea cercana o lejana, se almacena en la pila una dirección de retorno de 16 bits o dos palabras de 16 bits indicando en este último caso tanto el offset (IP) como el segmento (CS) a donde volver.

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. Para que el ensamblador interprete el número como real ha de llevar el punto decimal:
               temperatura DD     29.72
               espanoles91 DQ     38.9E6
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)
               basura      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))
5.3.2. – 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]


martes, 30 de agosto de 2016

IDE'S PARA PROGRAMAR EN LENGUAJE ENSAMBLADOR

1. WinAsm

WinAsm Studio es un entorno de desarrollo integrado (IDE) gratuito para desarrollar programas en Windows 32-bit y DOS 16-bit utilizando Microsoft Macro Assembler MASM y FASM utilizando el Add-In para FASM. Ha sido escrito por Antonis Kyprianou (akyprian). 
Más información aquí (Web oficial): http://www.winasm.net/

2. Easy Code

Entorno visual de desarrollo en lenguaje ensamblador.

Easy Code es el entorno visual de programación en ensamblador hecho para generar aplicaciones de 32 bits para Windows. La interfaz de Easy Code, muy parecida a la de Visual Basic, le permite programar una aplicación en ensamblador de manera rápida y fácil como nunca antes había sido posible.
Más información aquí (Web oficial): http://www.easycode.cat/Spanish/index.htm

3. RadASM

RadASM es un IDE gratuito para ensambladores de 32 bits para Windows.
Soporta MASM, TASM, FASM, NASM, GoASM y HLA
Más información aquí (Web oficial): http://www.radasm.com/

4. Fresh IDE
Es un IDE visual para el lenguaje ensamblador con un compilador integrado Flat assembler (FASM). Está escrito en Fresh IDE y es una aplicación independiente compilable. Es totalmente compatible con FASM y puede ser compilado también con todas las versiones de FASM. El objetivo principal de Fresh IDE es hacer la programación en ensamblador tan rápido y eficiente como en los lenguajes de alto nivel, sin sacrificar el tamaño de una pequeña aplicación que potencia el lenguaje ensamblador. Se trata de una aplicación Windows, pero se ejecuta en Wine muy bien y puede crear, compilar, depurar y ejecutar aplicaciones para Windows y Linux en Windows y Linux. Descarga aquí.

5. Assembler IDE

Se trata de un entorno de desarrollo para código ensamblador, cuyo propósito es automatizar al máximo este proceso integrando el editor de código, el depurador (debugger) y el desensamblador.

Entre las posibilidades que nos ofrece el entorno Assembler IDE, destacan la depuración de código (debugging), el editor de código, el desensamblador o la compilación con NASM, TASM/MASM y FASM.

Como puedes comprobar se trata de una herramienta de lo más completita.

Y no dejes que te intimide el hecho de que el programa Assembler IDE esté únicamente disponible con los textos que aparecen en pantalla en idioma inglés, ya que sus desarrolladores han diseñado una interfaz de usuario que resulta muy clara, sencilla e intuitiva, de tal manera que cualquiera que se ponga a los mandos de esta aplicación la encontrará de lo más accesible.

Y no queremos poner el punto y final a esta reseña sin mencionar el que, sin lugar a dudas, será uno de los aspectos más interesantes y atractivos del programa: su inmejorable precio. Y es que, como estamos ante una aplicación que se distribuye mediante licencia "freeware", podremos descargar Assembler IDE gratis. Descarga aquí.

Algunos IDE de paga:

1. Visual Studio Professional ($499.99 USD)

Visual Studio 2015 es un completo entorno de desarrollo integrado para crear aplicaciones espectaculares para Windows, Android e iOS, además de aplicaciones web y servicios de nube innovadores.
  • Herramientas y servicios para proyectos de cualquier tamaño o complejidad
  • C#, Visual Basic, F#, C++, Python, Node.js y HTML/JavaScript
  • Planificación de sprint
  • Depuración y creación de perfiles avanzadas, pruebas automatizadas y manuales
  • DevOps con implementaciones automatizadas y supervisión continua
2. Codelite ($39 USD)
wxcrafter logo

Existen muchos entornos de desarrollo dedicados a C/C++, pero este por un motivo u otro no es tan conocido como otras opciones libres como Codeblocks o Dev-C++. Hablamos de Codelite: Un IDE multiplataforma para C/C++.
El proyecto codelite ya lleva bastantes años desde que inicio su andadura y cada vez su comunidad es mayor y cuenta con más características. Está escrito en C++ (Como cabe esperar de un IDE para C++) y usa las bibliotecas wxWidgets para la interfaz. Lo que nos asegura un IDE multiplataforma y que se adapta visualmente a todos los sistemas operativos.