Informe - Escuela de Ingeniería Eléctrica

Transcripción

Informe - Escuela de Ingeniería Eléctrica
Universidad de Costa Rica
Facultad de Ingeniería
Escuela de Ingeniería Eléctrica
IE – 0502 Proyecto Eléctrico
UCRASM entorno de diseño de programación para
ensamblador NASM con el set de instrucciones
IA32
Por:
Emmanuel Barrantes Chaves
Ciudad Universitaria Rodrigo Facio
Agosto del 2011
UCRASM entorno de diseño de programación para
ensamblador NASM con el set de instrucciones
IA32
Por:
Emmanuel Barrantes Chaves
Sometido a la Escuela de Ingeniería Eléctrica
de la Facultad de Ingeniería
de la Universidad de Costa Rica
como requisito parcial para optar por el grado de:
BACHILLER EN INGENIERÍA ELÉCTRICA
Aprobado por el Tribunal:
_________________________________
M.Sc. Enrique Coen Alfaro
Profesor Guía
_________________________________
Ing. Daniel Díaz Bolaños
Profesor lector
_________________________________
Ing. Diego Valverde G.
Profesor lector
ii
DEDICATORIA
A Dios que me ha dado todo lo que tengo y
a mis padres, soy lo que soy gracias a ellos.
iii
RECONOCIMIENTOS
Al profesor Daniel Díaz, este proyecto
se finalizo gracias a el.
iv
ÍNDICE GENERAL
DEDICATORIA............................................................................................III
RECONOCIMIENTOS................................................................................IV
NOMENCLATURA......................................................................................XI
RESUMEN....................................................................................................XII
CAPÍTULO 1 : INTRODUCCIÓN ...............................................................1
Objetivos...................................................................................................3
Objetivo general...................................................................................................3
Objetivos específicos............................................................................................3
Metodología..............................................................................................4
CAPÍTULO 2: DESARROLLO TEÓRICO.................................................5
Sistema operativo GNU/Linux Ubuntu..................................................5
Origen...................................................................................................................5
Proyecto GNU......................................................................................................9
Características Linux..........................................................................................11
Filosofía GNU....................................................................................................12
v
Situación actual de merado Linux......................................................................13
Ubuntu................................................................................................................14
C++..........................................................................................................15
Code:: Blocks..........................................................................................16
Origen.................................................................................................................17
Instalación..........................................................................................................17
WxWidgets.........................................................................................................19
IDE...........................................................................................................22
Nasm........................................................................................................23
Instalación..........................................................................................................26
CAPÍTULO 3: INTERFAZ GRÁFICA.......................................................28
Proyecto...................................................................................................28
Construcción gráfica..............................................................................34
Pestañas..............................................................................................................35
Projects..............................................................................................................36
Symbols.............................................................................................................37
Resources...........................................................................................................37
Widgets...............................................................................................................37
Editor de la barra de menú.................................................................................41
vi
CAPÍTULO 4: CLASE Y FUNCIONES IMPLEMENTADAS.................44
TRIE........................................................................................................44
Push....................................................................................................................45
CheckNC............................................................................................................47
CheckC...............................................................................................................47
OnQuit.....................................................................................................47
OnAbout..................................................................................................48
OnClose...................................................................................................48
Abrir........................................................................................................49
Nuevo.......................................................................................................50
Guardar...................................................................................................51
GuardarComo........................................................................................51
CargarDicc..............................................................................................52
CargarReg...............................................................................................52
Revisarlinea............................................................................................53
RevisarTodo............................................................................................54
Compilar.................................................................................................55
vii
Correr......................................................................................................56
CompyCor...............................................................................................57
Check.......................................................................................................57
CAPÍTULO 5: CONCLUSIONES Y RECOMENDACIONES................59
Conclusiones...........................................................................................59
Recomendaciones...................................................................................60
BIBLIOGRAFÍA............................................................................................61
GLOSARIO....................................................................................................62
ANEXOS.........................................................................................................65
viii
ÍNDICE DE FIGURAS
Figura 2.1 Cuota del mercado en computadoras11.........................................................14
Figura 2.2 Instalación manual...........................................................................................18
Figura 2.3 Instalación automática.....................................................................................19
Figura 3.1 Nuevo proyecto.................................................................................................28
Figura 3.2 proyecto wxWidgets parte 1............................................................................29
Figura 3.3 proyecto wxWidgets parte 2............................................................................29
Figura 3.4 proyecto wxWidgets parte 3............................................................................30
Figura 3.5 proyecto wxWidgets parte 4............................................................................31
Figura 3.6 proyecto wxWidgets parte 5............................................................................32
Figura 3.7 proyecto wxWidgets parte 6............................................................................33
Figura 3.8 proyecto wxWidgets parte 7............................................................................34
Figura 3.9 Ventana del Proyecto........................................................................................35
Figura 3.10 Una vez agregado wxNotebook.....................................................................38
Figura 3.11 Después de agregar el wxStaticText..............................................................39
Figura 3.12 Después de agregar el wxTextCtrl................................................................40
Figura 3.13 Editor de la barra de menú............................................................................41
Figura 3.14 Editor de la barra de menú............................................................................43
Figura 4.1 Árbol binario y TRIE.......................................................................................45
ix
Figura 4.2 TRIE ejemplo después de insertar “pul”.......................................................46
Figura 4.3 TRIE después de la palabra “pull”.................................................................46
Figura 4.4 Selector de archivos..........................................................................................48
Figura 4.5 Selector de archivos..........................................................................................49
Figura 4.6 Nueva pestaña ..................................................................................................50
Figura 4.7 Texto resaltado..................................................................................................54
x
NOMENCLATURA
GNU: Es un acrónimo recursivo que significa “GNU No es Unix”, y se refiere al sistema
operativo completo de software libre.
GUI: Este acrónimo se refiera a la interfaz gráfica, Graphic User Interface por sus siglas en
ingles.
HTTP:Hypertext Transfer Protocol es un protocolo que se utiliza en todas las transacciones
en la internet.
NASM: Es un lenguaje de programación en ensamblador y es un acrónimo para Netwide
Assembler.
SO: es acrónimo utilizado para Sistema Operativo, y esto es un conjunto de programas
realizando funciones en un sistema informático.
xi
RESUMEN
El proyecto se realizó con el objetivo principal de brindar una herramienta, para la
programación bajo el lenguaje NASM. El programa debía presentar una interfaz gráfica que
fuera amigable con el usuario y ser fácil de utilizar.
Se investigó acerca del lenguaje C++ y las biblioteca wxWidgets, para poder
cumplir con todos los objetivos del proyecto. Se utilizó el programa Code::Blocks, el cual
resultó ser un mediador entre el lenguaje y la biblioteca.
Luego de la investigación se procedió con la codificación del programa UCRASM,
se realizaron pruebas exhaustivas y a su ves se realizaron las correcciones pertinentes. La
aplicación fue desarrollada bajo la plataforma GNU/Linux en la distribución Ubuntu de 32
bits y Ubuntu de 64 bits. Esta sirvió como base para el desarrollo de todo el proyecto y
como entorno de pruebas de la aplicación. El tipo de pruebas fueron tanto funcionales como
pruebas destructivas, es decir, se probó que el programa realizara todas las funciones
descritas en este documento, como probar la reacción del programa a errores intencionales.
El programa tiene potencial para crecer, se le pueden realizar mejoras que salen de
los objetivos de este proyecto. Se podría mejorar la interfaz gráfica, de tal manera que el
programa se aún mas agradable para el usuario, también se podría expandir el programa
para que no solo reconozca el set de instrucciones IA32 sino también instrucciones de 64
bits.
xii
1 Capítulo 1 : Introducción
El presente proyecto pretende desarrollar un programa que realice funciones
comunes de un IDE(integrated development environment) por sus siglas en ingles, el cual
es un programa que otorga al usuario una interfaz amigable para desarrollar algún lenguaje
de programación, en este caso sera el lenguaje de programación ensamblador libre para la
plataforma Intel x86 llamado Nasm.
La utilización de editores de texto comunes con los que se escribe actualmente
código para Nasm, representan un obstáculo para la programación. Estas herramientas son
muy poco flexibles y no representan ninguna ayuda para la programación de este lenguaje
La necesidad de sustituir los editores de texto comunes, e implementar una
herramienta capaz de facilitar al usuario dicha programación es la razón que impulso este
proyecto. Además en algunos cursos, del plan de estudio de la carrera Ingeniería Eléctrica
con énfasis en Computadoras y Redes se utiliza este lenguaje en la realización de
proyectos, tareas y exámenes para los cuales esta aplicación puede brindar una gran ayuda.
El proyecto desarrollado se distribuye bajo la licencia GPL, esta licencia implica
que cualquier persona es libre de utilizar, estudiar, modificar o ajustar el programa, siempre
que la nueva aplicación desarrollada se distribuya bajo la misma licencia.
1
2
El proyecto fue elaborado en su totalidad sobre la plataforma de software libre
llamada Ubuntu, el cual es una distribución de GNU/Linux. Edemas de la plataforma se
utilizaron la aplicación Code::Blocks y se desarrolló en el lenguaje de programación C++.
Code::Blocks es una herramienta que facilita la creación de entornos gráficos de
programas, para poder hacerlos amigable con el usuario. Este tiene una licencia que permite
una libre copia y distribución, la cual es GPL versión 3. La lógica del programa y sus
funciones fueron implementadas en programas en C++.
La aplicación desarrollada cuenta con opciones de crear, compilar y corres
documentos desde el programa ya que esto representa un ahorro de tiempo, en el desarrollo
y prueba del documento, además que esto representa otra mejora y un motivo mas para la
utilización de este programa en vez de de un editor de texto común.
3
1.1
Objetivos
1.1.1 Objetivo general

Diseñar un Entorno de Desarrollo Integrado (IDE) para el lenguaje de programación
ensamblador NASM.
1.1.2 Objetivos específicos

Proporcionar a los usuarios una herramienta solida que permita facilitar la
programación y aprendizaje del ensamblador NASM, por medio de la señalización
de errores sintácticos, y marcación de instrucciones.

Implementar un entorno gráfico que haga que la utilización del programa sea mas
agradable para el usuario, utilizando el
Entorno de Desarrollo Integrado
Code::Blocks y C++.

Implementar opciones de crear, compilar y correr documentos con formato “asm”,
desde el programa y no desde la terminal de Linux, esto facilitara la manipulación y
prueba de estos documentos.
4
1.2
Metodología
Para el desarrollo de este proyecto se investigó sobre el manejo y la creación de
estructuras gráficas bajo el ambiente de creación gráfico Code::Blocks, y plantillas de
proyecto de WxWidgets. Se consideró que estas herramientas cumplieran todas las
opciones necesarias para llevar a cabo el proyecto correctamente, de modo que no fuera
necesario otro programa.
Luego de implementar el entorno gráfico, se procedió a realizar la lógica detrás de
ese entorno gráfico, esto es otorgando funciones a cada uno de los widgets. Como por
ejemplo resaltar los comandos del lenguaje nasm con forme se fuera utilizando la barra
espaciadora o la tecla “enter”. Para las opciones de compilar y correr los documentos, se
tuvo que investigar sobre la utilización de Code::Blocks y la terminal de Linux. Una vez
profundizado en el tema se crearon las opciones.
Al haber terminado el programa se procedió a crear un proceso de verificación del
mismo, con la intención de encontrar fallas, faltas y errores, mas conocidos como pulgas.
Por cada elemento del programa se realizaron pruebas y se provocaron errores para
observar como el programa reaccionaba a estos y los manejaba. Luego de este proceso se
presentó el programa a compañeros estudiantes con el fin de una ultima purgación de fallas,
faltas y errores. Ya que como los compañeros no conocían la estructura del programa,
representan una forma de prueba no realizada con anterioridad. Después de estas pruebas se
dio como finalizado el programa.
2 CAPÍTULO 2: Desarrollo teórico
2.1
Sistema operativo GNU/Linux Ubuntu
2.1.1 Origen
El desarrollo del sistema operativo GNU/Linux esta casi totalmente ligado al
sistema UNIX. El cual empieza a mostrarse gracias al desarrollo de un proyecto iniciado en
1968, llamado MULTICS(Multiplexed Information and Computing System, sistema
multiplexado de información y computación).1
En aquella época un grupo de investigadores de General Electric, AT&T Bell y el
MIT(Massachussets Institute of Technology, Instituto Tecnológico de Massachussets) se
unieron para desarrollar un sistema operativo que contara con los nuevos conceptos de
multitarea, gestión de archivos y la interacción con el usuario. El problema con este
proyecto fue que resultó ser muy ambicioso, por lo que no se logró su finalización y se
abandono luego de ciertos contratiempos y retrasos.1
Después se retoma el proyecto y en 1969 conduce al desarrollo del sistema
operativo UNIX, desarrollo encabezado principalmente por Ken Thompson y Dennis
Ritchie junto con algunos otros investigadores que pertenecieron al proyecto MULTICS.
Este sistema operativo, el cual en el momento tenia el nombre de UNICS, se implementó
5
6
por primera vez en una computadora DEC PDP-7. El nombre UNIC( Uniplexed
Information and Computing System, sistema uniplexado de información y computación)
hace referencia a su predecesor el proyecto MULTICS, solo que en este proyecto solo
podía soportar dos usuarios simultáneamente. En 1970 el nombre sufre un cambio y pasa a
llamarse UNIX, nombre con el que este sistema operativo es conocido actualmente.
Al inicio el código de UNIX estaba escrito en lenguaje ensamblador, sin embargo
esto representaba una poca portabilidad, o sea era difícil de trasladar este sistema operativo
a diferentes computadoras y el código dependía del tipo de maquina. Para 1973 Dennis
Ritchie, uno de los creadores del lenguaje C, junto con Ken Thompson crearon un proyecto
para escribir de nuevo el código de UNIX pero esta vez en el lenguaje C. Esto aumento
bastante su atractivo ya que fue el primer sistema operativo en ser escrito en un lenguaje de
alto nivel. Gracias a esto era posible portar el sistema operativo a diferentes computadoras
realizando pocas modificaciones, lo único que se requería era hacer una compilación en la
maquina destino.
Debido a su creciente demanda los laboratorios Bell, cambiaron la forma en que se
distribuía este sistema operativo, ya que paso de ser de forma gratuita y con el objetivo
principal de la investigación, a ser de forma oficial concediendo licencias a los usuarios.
Hasta en 1974 los laboratorios Bell empezó a utilizar UNIX de forma masiva.
La Universidad de California en Berkeley, comenzó a aportar nuevas características
al sistema operativo convirtiéndolo en un estándar En 1975 Ken Thompson creo su propia
7
versión del sistema operativo llamada BSD(Berkeley Software Distribution, distribución de
software de Berkeley). Bill Joy y Chuck Haley, estudiantes graduados, fueron los
principales contribuidores a esta nueva versión, aportaron el editor de texto “vi” y el editor
de texto “ex”, un compilador en Pascal y el Shell C entre otras. Gracias a esto BSD paso a
ser el principal competidor con los laboratorios Bell.1
BSD pasa a ser la base de un proyecto de la DARPA(Defense Advanced Research
Projects Agency, Proyectos de Investigación Avanzada del Departamento de Defensa) a
finales de los años setenta.
Fue en 1982 que se realiza el primer lanzamiento de una versión comercial del
sistema operativo UNIX, por los laboratorios Bell y esta versión posee el nombre de
Sistema III. En 1983 AT&T presenta el sistema operativo UNIX Sistema V versión 1,
además AT&T prometió a sus usuarios total compatibilidad con las próximas versiones de
sus sistemas UNIX.
BSD versión 4.2 es lanzada por Berkeley en 1983, su principal característica, era
que podía manejar conexiones con protocolos TCP/IP, protocolos que todavía se utilizan.
Esta característica produjo un gran impacto en la demanda, produjo que esta versión fuera
adoptada por varios fabricantes de computadoras, como por ejemplo Sun MicroSystems
compañía fundada por Bill Joy, lo que luego da lugar a SunOS.
En 1980 sale al mercado una versión llamada XENIX introducida por Microsoft, la
cual dio un gran aporte ya que permitió un acercamiento de UNIX a las plataformas PC.
8
Después en 1987 Microsoft y AT&T hacen una fusión de XENIX con UNIX Sistema V,
dando como resultado la versión 3.2 de UNIX Sistema V. Lo que permitió que un sistema
UNIX estuviera disponible para una gran variedad de computadoras.
Sin embargo todas estas diferentes versiones de UNIX provocaban muchos
problemas de incompatibilidad, debido a sus grandes diferencias, lo que hacia que los
programadores tuvieran que crear distintas versiones de sus programas para cada una de las
versiones de UNIX. Gracias a esto los laboratorios Bell intentan hacer una unificación, para
poder aumentar la portabilidad de los programas en las distintas versiones de UNIX, en la
década de los ochenta. El objetivo era tomar lo mejor de cada una de las mejores versiones
de la época, y hacer un solo sistema operativo. Se tomó UNIX Sistema V(AT&T),
XENIX(Microsoft), SunOS(Microsystems), formando UNIX Sistema V versión 4, y con
esto se minimizo las versiones a dos, Sistema V y BSD.
Una organización independiente formada por usuarios del sistema UNIX llamada
/usr/group, tenia como objetivo principal aumentar la portabilidad de los programas para
UNIX. En 1985 esta organización publica el estándar POSIX(Portable Operating System
Interface for Computer Environment, Interfaz de Sistema Operativo Portable para Entornos
de Computadoras).
9
Actualmente existen versiones diferentes de UNIX como:

Solaris: Creado por Sun Microsystems, esta basada en la versión de
UNIX Sistema V versión 2. Es soportada por las plataformas Power PC,
Intel y SPARC.

AIX: Basada en la versión UNIX Sistema V versión 3 y BSD 4.3,
soportada por plataformas IBM y Power PC.

A/UX: Versión de la Apple de UNIX.

HP-UX: Creada por Hewlett-Packard, basada en la versión UNIX
Sistema V versión 2.

IRIX: Basada en al versión UNIX Sistema V versión 4, realizada por
Silicon Graphics.

SCO UNIX: Realizada por Santa Cruz Operation (SCO), basada en la
versión UNIX Sistema V versión 3.2.

Linux: Inicio como un proyecto de Linus Torvalds en la universidad de
Helsinki al inicio de los años noventa.
2.1.2 Proyecto GNU
Conforme aumentaba la popularidad de UNIX en el mercado, así iban terminando
sus distribuciones gratuitas, la ultima empresa en dar distribuciones gratuitas fue AT&T.
AT&T facilitaba el sistema UNIX gratuitamente a las Universidades, con el objetivo de su
estudio, ya que a AT&T no se le permitía estar en el mercado de las computadoras. El
10
código fuente dejó de aportarse junto con el sistema UNIX, esto fue el detonante que llevo
a Andrew Tannenbaum a programar su propio clon de UNIX, el cual fue llamado Minix.
El objetivo principal de este clon era la pedagogía, ya que Andrew Tannenbaum lo utilizaba
en su clases en la Universidad Libre de Ámsterdam.
Este clon cumplía con varias
características tales como no ser excesivamente complejo pero contar con las ultimas
novedades de la tecnología, que existiera la posibilidad que los estudiantes pudieran
disponer de él en sus casas. Sin embargo esto solo cubría las necesidades de la Universidad
Libre de Ámsterdam, y como UNIX dejo de ser gratuito las organizaciones tenían que
pagar por él. Por lo que se inició el proyecto GNU, con el cual se deseaba crear un sistema
portable, gratuito, avanzado, que facilitara el código fuente al publico y con un aspecto
similar a UNIX. Los programas de este proyecto se debía distribuir con la licencia
GPL(General Public License, Licencia Pública General), la cual daba a los usuarios la
capacidad de distribuir copias sin ningún tipo de problema, además de la posibilidad de
modificar el código fuente con la condición de mantener el copyright del programa. Los
programas del proyecto GNU son parecidos a los programas comerciales y en muchos
casos los superan en calidad, gracias a la Internet estos programas se han difundido y con
esto se facilita la creación de los mismos, ya que miles de voluntarios alrededor del planeta
llevan a cabo este proyecto.
Linus Torvalds creo un pequeño núcleo a partir de algún clon de UNIX como un
proyecto de investigación, al inicio de los años noventa. Luego de pulir su diseño
11
distribuyó su versión bajo al licencia GPL, invitando a la personas a probarlo y mejorarlo.
Coloco en uno de los foros de Usenet el siguiente mensaje:
“¿Echa de menos aquellos días de Minix 1.1, cuando los hombres eran hombres y
escribían sus propios controladores de dispositivos? ¿No tiene ningún proyecto
interesante y se muere de ganas de hincarle el diente a un sistema operativo que
pueda modificar para ajustarlo a sus propias necesidades? ¿Encuentra frustrante
que todo funcione en su sistema operativo? ¿Ya no pasa noches en vela intentando
configurar un ridículo programa? Entonces este mensaje puede ser justamente
para usted.“ 1
2.1.3 Características Linux
Linux posee varias ventajas sobre los otros sistemas actuales como por ejemplos:

Es muy consistente: quiere decir que la manera en que se utiliza no varia mucho de
función en función, por ejemplo las ordenes siempre tienen la misma sintaxis.

Dispone de aplicaciones muy potentes.

Es estable y robusto: independiza los procesos diferentes de tal forma que si uno
deja de funcionar no obstruya el correcto funcionamiento de los demás.

Es muy compatible con el trabajo con redes de computadoras.

Portabilidad: se puede utilizar en diferentes plataformas.
12

Aprovechamiento de los recursos: con pocos recursos Linux puede dar excelentes
resultados.

Amplia documentación: que cubre todas las secciones del sistema, además se puede
obtener ayuda de otros usuarios por medio de Internet.
2.1.4 Filosofía GNU
El pilar principal que sostiene la filosofía GNU es la licencia Copyleft. Existen
usuarios que toman un programa regido bajo la licencia de software libre, modifican un
poco o nada el programa, y lo comercializan como software privativo. El objetivo principal
del método Copyleft es impedir que ocurran casos como el mencionado anteriormente.
Copyleft es un método general para hacer que los programas redistribuidos, ya sean
modificados o no, deban ser distribuidos con total libertad, tal y como el creador del
programa original lo distribuyo, o sea el nuevo programa debe contar con la misma libertad
del programa padre. Copyleft garantiza esta libertad de los programas.1
El nombre Copyleft se deriva de la intención del mismo, o sea que va en dirección
contraria a lo que es el Copyright. Copyright quita la libertad a los usuarios, por otro lado
Copyleft otorga esta libertad, como se observa siguen direcciones contrarias .
Todas las licencias están diseñadas de tal manera que se puedan copiar fácilmente a
los nuevos programas. Solo se debe incluir una copia de la licencia, sin modificar, en la
documentación del nuevo programa.
13
2.1.5 Situación actual de merado Linux
Linux presenta presenta crecimiento en algunos sectores del mercado actual, sin
embargo esta todavía por debajo del dominante del mercado, Windows. En la Figura 2.1 se
observa la distribución del mercado de los sistemas operativos para el año 2008, se puede
ver que Linux es dueño del tercer tercer lugar en el mercado. El dominio del mercado, por
parte de Windows, se debe a los siguientes aspectos:

La costumbre: Muchos usuarios no desean probar nuevos sistemas operativos, por
lo engorroso que representa aprender a utilizar uno nuevo.

Al perfil de los usuario: Existen usuarios que simplemente por sus empleos o
estudios, no tienen otra opción mas que utilizar Windows.

Educación: A los estudiantes tanto de primaria como secundaria e inclusive a los
universitarios se les enseña a trabajar bajo Windows. Esto esta cambiando por lo
menos para los estudiantes universitarios.

Juegos: Los juegos representan una parte importante en el mercado de
computadoras, y existen muchos que no se pueden portar a otros sistemas
operativos, por lo que los usuarios deben utilizar Windows para jugar con ellos.6
14
Figura 2.1 Cuota del mercado en computadoras11
En cuanto a servidores Linux(Apache) domina el mercado, en los últimos 14 años
Linux a llegado a alcanzar el 72% de consumo, mientras que Windows lo máximo que
alcanzó fue el 36%.
2.1.6 Ubuntu
Ubuntu es un sistema operativo basado en otro sistema operativo de Linux,
“Debian”, Ubuntu también tiene como núcleo a Linux. La empresa Canonical da soporte
técnico a Ubuntu. Esta empresa es privada y fue fundada por Mark Shuttleworth.9
Una ves que Linux se estableció en el año 2004, el software libre todavía no era una
opción para todos los usuarios, es por esto que Mark Shuttleworth junto con un grupo de
diseñadores del proyecto “Debian”, construyeron un entorno de Linux fácil de utilizar para
todo tipo de usuarios, llamado Ubuntu. Ubuntu viene de una palabra antigua de África que
15
significa “Igualdad/Lealtad a los demás”, también quiere decir “Soy lo que soy, por lo que
todos son”.9
Una diferencia fundamental entre Ubuntu y las versiones comerciales de Linux, es
que Ubuntu no divide el esfuerzo en una versión comercial de alta calidad y una versión
gratis de una calidad pobre .
La primera versión de Ubuntu fue la 4.10 llamada “Warty Warthog” fue liberada en
Octubre del 2004, el siguiente año se vio un gran crecimiento en la comunidad de Ubuntu.
Hoy en día Ubuntu es libre y seguirá siendo así, además Ubuntu esta creciendo no solo en
el mercado de software para computadores sino para otros tipos de sistemas como teléfonos
celulares.
2.2
C++
C es un lenguaje compilado, evoluciono de BCPL y B. BCPL.BCPL fue
desarrollado por Martin Richards en 1967, y su objetivo principal era tener un lenguaje para
escribir software y crear compiladores para sistemas operativos. BCPL y B. BCPL tenían
como característica principal el que sus datos no tuvieran tipo, o sea que todas las variables
poseían el mismo tamaño en memoria, por lo que era responsabilidad del programador
tratar el dato de la manera que mas le conviniera.2
C fue derivado de B por Dennis Ritchie en 1972. En sus inicios se dio a conocer
porque fue el lenguaje con el que se desarrollo UNIX, actualmente todos los sistemas están
escritos en lenguaje C y/o C++. Uno de sus atractivos es la portabilidad, esto es gracias a
16
que C es independiente del Hardware, puede ser compilado en casi todas las computadoras.
A finales de los años setenta, ya se había establecido un C “tradicional”, sin
embargo conforme se expandía C en las diferentes plataformas, lo cual producían
problemas de compatibilidad, por lo que en 1983 se creo el comité técnico X3J11 bajo el
American National Standard Committee on Computer and Information Processing , con la
intención de definir un estándar no ambiguo. En 1989 aprobaron el estándar que se conoce
como ANSI/ISO 9899:1990.
C++ fue diseñado por Bjarne Stroustrup en 1983 en los Laboratorios Bell, y es un
superconjunto del lenguaje C. Aporto nuevas características que hacen mas atractivo el
lenguaje C, la principal es que adhiere la capacidad de llevar a cabo la programación
orientado a objetos.2
2.3
Code:: Blocks
Code::Blocks es un programa, de código abierto, que facilita la creación de
interfaces gráficas para códigos escritos en C/C++. Code::Blocks fue desarrollado bajo el
lenguaje C++. Este programa presenta herramientas para crear y modificar ventanas,
botones, menús, paneles, etiquetas y todas aquellas partes de un programa con las que
interactúa el usuario.
17
2.3.1 Origen
Los diseñadores de Code::Blocks presentaron dos versiones , la versión 1.0rc1, la
cual fue presentada el 25 de Julio del 2005 y la versión 1.0rc2, la cual fue presentada el 25
de Octubre del 2005. Sin embargo la segunda versión no fue bien recibida por los usuarios,
por lo que en ves de presentar una versión final, los diseñadores optaron por presentar
actualizaciones diarias llamadas "nightly builds"(construcciones nocturnas), esto permitía a
los usuarios proporcionar comentarios o quejas de la actualizaciones, y se podían corregir
para la siguiente actualización, esto produjo la sensación de que el proyecto estaba
estancado, es decir se había quedado en una versión definitiva.
El 28 de febrero del 2008, se presento la primera versión estable, esta versión fue la
8.02, el nombre se debe a la fecha de presentación, el 8 corresponde al año y el 02
corresponde al mes. Actualmente la versión disponible de Code::Blocks es la versión 10.05.
2.3.2 Instalación
Existen varias alternativas para la instalación, de las cuales solo se explicaran dos,
descargando
el
instalador
de
la
pagina
oficial,
la
cual
es
http://www.codeblocks.org/downloads, y utilizando Centro de software de Ubuntu.
Para llevar a cabo la instalación con la primera opción se debe visitar la pagina
oficial de Code::Blocks http://www.codeblocks.org/ en la sección de descargas, se
selecciona la sección de archivos binarios, luego se busca el archivo comprimido
18
“codeblocks-XX.XX-1-debian-YYYYY.tar.bz2”(XX.XX
representa
la
versión
de
Code::Blocks, YYYY representa el tipo de plataforma en el que se desea instalar
Code:Blocks. Si se desea instalar en 32-bits se usa “i386”, si se desea instalar en 64-bits se
utiliza “amd64”).
Una vez terminada la descarga, se debe descomprimir el archivo, obteniendo una
carpeta llamada amd64 dentro de la cual existen varios archivos .deb, solo se le debe dar
doble click a cada uno de los archivos. Se desplegara una ventana del Centro de software de
Ubuntu como en la Figura 2.2.
Otra forma instalar los archivos .deb, es utilizando una terminal, posicionarse en el
directorio donde se encuentran los archivos .deb y ejecutar el comando “sudo dpkg -i
*deb”, con esto automáticamente se instalaran todos los archivos .deb.
Figura 2.2 Instalación manual
Existe una forma de instalación automática, solo se debe ingresar al programa
Centro de software de Ubuntu, buscar programas por el nombre Code::Blocks, dar click en
19
el botón que dice “Más información” aparece una ventana similar a la de la Figura 2.3,
para finalizar solo se da click al botón Instalar y se espera a que la instalación finalice.
Figura 2.3 Instalación automática
2.3.3 WxWidgets
WxWidgets es un conjunto de bibliotecas de C++ que permite desarrollar y crear
interfaces gráficas para aplicaciones, tanto para Windows, Linux y UNIX en arquitecturas
de 32 bits y 64 bits, como para arquitecturas de celulares como Windows Mobile y iPhone
SDK.12
WxWidgets representa una forma sencilla de crear interfaces gráficas para
aplicaciones en distintas plataformas, la facilidad que presenta es que la aplicación siempre
va a tener widgets que combinan con la configuración gráfica de la plataforma, por ejemplo
20
si el usuario le cambia los colores a todas las ventanas, la ventana de la aplicación también
cambiara de color.
Las principales características que ofrece wxWidgets son la ayuda en línea, la
programación de redes, subir y guardar imágenes en una variedad de formatos y soporte de
base de datos.
El proyecto wxWidgets nace en 1992 por Julian Smart en el Artificial Intelligence
Applications Institute(Instituto de las Aplicaciones de la Inteligencia Artificial) de la
Universidad de Edinburgh.9
Conforme pasó el tiempo, una pequeña pero entusiasta comunidad de los usuarios
de wxWidgets, se estableció aportando contribuciones y reparaciones, las contribuciones
mas grandes eran por parte de los usuarios de plataformas Mac. WxWidgets fue obteniendo
mas y mas usuarios alrededor del mundo. Estos usuarios pertenecían al sector tanto
comercial, gubernamental como industrial, estos pensaban que wxWidgets ofrecía un mejor
producto, un mejor soporte que los productos comerciales de la época
En 1996 wxWidgets se estanco un poco, Julian dejó el Artificial Intelligence
Applications Institute para ser un consultor independiente, después de eso se liberaron
pocas versiones. Lo que parecía un avance incontenible de Java estaba produciendo dudas
con respecto al futuro de las bibliotecas de C++. Gracias a muchas contribuciones el código
de wxWidgets llego a verse cansado y con necesidad de un replanteamiento. Al inicio de
1997 se dio este replanteamiento, comprometiéndose a hacer de wxWidgets lo
21
suficientemente flexible para las futuras y actuales tendencias, con mas widgets y un mejor
uso de C++.9
Ya para el final de 1997 Julian Smart empezó
a distribuir CD-ROMs de
wxWidgets. Para versión wxWidgets 2.1.11 se observa los impresionantes atributos de la
clase wxHTML de Vaclav Slavik, incluía impresión y vista . WxHTML daba acceso a una
forma fácil ver texto con formato, además daba la capacidad de presentar reportes.
Para instalar wxWidgets solo es necesario instalar Code::Blocks ya que, wxWidgets
es parte fundamental de Code::Blocks. O si se desea se puede utilizar el programa “Gestor
de Paquetes Synaptic”, en la barra de búsqueda escribir “wxwidgets” e instalar los
siguientes paquetes(X.X representa la versión a instalar):

wxX.X-headers

libwxgtkX.X-0

wx-common

libwxgtkX.X-dev

libwxgtkX.X-dbg

libwxbaseX.X-0

libwxbaseX.X-dev

libwxbaseX.X-dbg
22
2.4
IDE
Un IDE es un programa que da herramientas a los desarrolladores de software para
facilitar su labor al programar. Comúnmente un IDE debe contar con cuatro características
las cuales son:

Un editor de código fuente.

Un compilador o interprete.

Herramientas para la ejecución automática.

Una herramienta para encontrar errores en el código.
Los primeros sistemas de programación se realizaban con tarjetas programadas, y
cintas magnéticas entre otros. Es por esto que cuando sale la primera consola o terminal
también aparece el primer IDE, el cual se controlaba desde terminal. El primer lenguaje de
programación en ser creado con un IDE fue “Dartmouth BASIC”. Este IDE tenia la
capacidad para editar y crear archivos, compilación, ejecución y herramienta para encontrar
errores, a pesar de que este IDE se manejaba vía comandos a través de la terminal y no
como los IDEs actuales que poseen interfaces gráficas.10
Maestro I es el nombre del primer IDE del mundo, fue creado por Softlab Munich
en 1975. Maestro I fue el líder en el mundo durante los años setenta, hoy en día se puede
encontrar un Maestro I en el museo de información y tecnología de Arlington. Otro IDE en
ser de los primeros en el mundo fue Softbench.9
Algunos IDEs que se pueden encontrar actualmente en la red son:
23

C/C++: NetBeans, Bloodshed, Kdevelop y Eclipse CDT.

Python: Komodo, NetBeans, PyCharm, WingIde, PyScripter, Pyshield y IEP.

Perl: Epic, Open Perl IDE, Optiperl, Kephra, Gvim y Emacs.

Java: Jcreator, IntelliJIDEA, NetBeans, Jedit, NEDit y BlueJ.

Masm: Winasm y Radasm.
2.5
Nasm
Netwide Assembler o Nasm es un lenguaje ensamblador, creado con la intención de
aportar mas portabilidad y modularidad. Soporta todas las extensiones de arquitectura x86
conocidas, como por ejemplo x86−64 , también soporta macros. Soporta varios tipos de
formatos de archivos tales como .out, elf, COFF, Mach−O . Fue diseñado para que la
sintaxis fuera sencilla de entender, muy parecida a la sintaxis de Intel, un poco menos
complejo.
Nasm surgió de la necesidad de tener un lenguaje ensamblador que cumpliera con
aspectos que los lenguajes ensamblador de la época no podían satisfacer. En ese momento
estaba el lenguaje “a86”, era un buen ensamblador pero no era gratis, tenia el problema de
que no tenia compatibilidad con 32-bit a menos que se pagara esta opción, y solo sirve para
Windows. Gas es otro ensamblador de la época el cual era gratis y soportado tanto para
Windows como para Linux, pero su corrección de errores era mínima, tenía una sintaxis no
atractiva y no tenia una compatibilidad adecuada con 16-bits.
24
El “as86”, fue ensamblador de la época que no satisfacía las necesidades. Tenia el
problema de que no existía suficiente documentación.
Masm era un ensamblador caro, malo y que solo se ejecuta en Windows.
Tasm contaba con una sintaxis que era esencialmente Masm, ya que Tasm se
esforzaba por tener compatibilidad con Masm lo que significaba muchas directivas y
tramites. Además era caro y solo se podía utilizar bajo la plataforma Windows.
Los problemas anotados anteriormente hicieron que creciera la necesidad de un
ensamblador que fuera gratis, con una sintaxis sencilla y que corriera en ambas plataformas
Windows y Linux.
El lenguaje NASM posee una licencia de software libre llamada “BSD license”. La
cual permite la redistribución del código fuente, ya sea con o sin modificación, siempre y
cuando cumpla con las siguientes reglas:

La redistribución del código fuente debe conservar el siguiente aviso copyright,
Copyright 1996−2011 the NASM Authors – All rights reserved.

Se debe adjuntar la siguiente renuncia:
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
25
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES;
LOSS
OF
USE,
DATA,
OR
PROFITS;
OR
BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE. 4
Lo cual significa:
Este este software es proporcionado por los derechos de autor y colaboradores "tal
cual" y ninguna garantía expresa o implícita, incluyendo, pero no limitada, a las
garantías de comercialización y aptitud para un propósito particular es rechazada.
En ningún caso el propietario del copyright o los colaboradores son responsables
por daños directos, indirectos, accidentales, especiales, ejemplares, o derivados
(incluyendo sin limitar, a la obtención de bienes o servicios, la pérdida de uso, de
datos o de beneficios, o interrupción), como en cualquier teoría de responsabilidad,
ya sea contrato, estricta responsabilidad, o agravio (incluyendo negligencia)
derivados de alguna manera a partir del uso de este software, incluso si se ha
advertido de la posibilidad de tales daños.
26
2.5.1 Instalación
A continuación se explican los pasos para tener una versión estable de Nasm
instalada en Linux.
Se
debe
descargar,
de
la
pagina
oficial
de
Nasm
http://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D, un archivo comprimido llamado
nasm−XXX.tar.gz donde XXX significa el numero de la versión que esta en el archivo.
Una vez descargado, se descomprime en el directorio /usr/local/src, una vez descomprimido
se creara una carpeta con el nombre “nasm−XXX”.
Una ventaja de la configuración de Nasm es que es automática, por lo que nada mas
se debe abrir una terminal, cambiar de directorio hacia la carpeta “nasm−XXX” con el
siguiente comando:
cd /usr/local/src/nasm−XXX
(Recordar cambiar XXX por la versión que se va a utilizar)
Luego se ejecuta el script “configure” con el siguiente comando:
./configure
Lo que hace este script es encontrar el mejor compilador de C para construir Nasm y
preparar los makefiles correspondientes.
Después de la autoconfiguración se debe escribir la palabra “make” en la terminal
para construir los archivos binarios “nasm” y “ndisasm”. Para finalizar se debe escribir el
comando:
make install
27
El cual instalara los archivos binario en /usr/local/bin e instalara manuales nasm.1 y
ndisasm.1 en /usr/local/man/man1. Y con esto ya se puede tener Nasm instalado en Linux.
3. CAPÍTULO 3: Interfaz gráfica
La interfaz gráfica representa una parte muy importa de este proyecto, esta es la que
permite que el programa sea amigable con el usuario. La interfaz gráfica se llevó a cabo por
medio de Code::Blocks y wxWidgets, herramientas útiles en la creación de interfaces
gráficas para aplicaciones. En este capitulo se explicara como se desarrolló la interfaz paso
a paso.
3.1Proyecto
Para crear un proyecto nuevo, se debe abrir el programa Code::Blocks, en la barra
de menú seleccionar la pestaña que dice “New”, luego seleccionar “Project”, aparecerá una
ventana igual a la Figura 3.1. En esta ventana aparecen las opciones de widgets con los que
sea desea trabajar, en este caso es wxWidgets entonces se selecciona el icono con el
nombre “wxWidgets project”.
Figura 3.1 Nuevo proyecto
28
29
En la primer ventana(Figura 3.2) aparece solo es un mensaje de bienvenida, para
avanzar es necesario dar clic en el botón “Next”.
Figura 3.2 proyecto wxWidgets parte 1
La ventana siguiente es para seleccionar la versión de wxWidgets con la que se va a
trabajar, en la ventana se mostraran las versiones de wxWidgets que se tienen instaladas en
el computador.
Figura 3.3 proyecto wxWidgets parte 2
30
Para este proyecto se seleccionó la versión 2.8.x porque era la ultima versión estable
disponible en el momento de crear el proyecto.
En la Figura 3.4 se observa la siguiente ventana en aparecer, en esta se deben llenar
los datos del proyecto las casillas corresponden a el titulo del proyecto, ubicación del
proyecto (carpeta en donde se va a guardar la carpeta que contiene todos los archivos para
el proyecto), nombre del archivo del proyecto y en la ultima casilla se presenta la ubicación
del nombre del archivo del proyecto. Los cambios realizados en las primeras 3 casillas
modifican automáticamente a la ultima.
Figura 3.4 proyecto wxWidgets parte 3
La cuarta ventana en aparecer se llena con información del autor de la aplicación,
llenar las casillas en esta ventana es opcional, por lo que se puede avanzar a ala siguiente
ventana al darle clic en “Next”. La información que se escriba en esta ventana(Figura 3.5)
31
será colocada al inicio de cada código fuente que sera creado al finalizar la creación del
proyecto.
Figura 3.5 proyecto wxWidgets parte 4
En la Figura 3.6 se puede ver la ventana siguiente se debe seleccionar una entre los
dos tipos de interfaz gráfica de usuario(GUI por sus siglas en ingles), para este proyecto se
seleccionó wxSmith ya que es la GUI que soporta más widgets. Además hay que
seleccionar el tipo de aplicación que se va crear, existen dos posibilidades tipo Dialog y
tipo Frame. Para este proyecto se utilizo tipo Frame, debido a que el uso de este tipo hace
que la ventana ya tenga la base de un menú, en la sección 3.2 se dará mas detalles al
respecto.
32
Figura 3.6 proyecto wxWidgets parte 5
En la siguiente ventana(Figura 3.7) no se debe modificar absolutamente nada, sin
embargo para mas información en esta ventana se selecciona el compilador, la dirección en
donde se creara el ejecutable final y la dirección en donde se crearan los archivos .o, los
cuales son archivos temporales de la compilación.
33
Figura 3.7 proyecto wxWidgets parte 6
En la ultima ventana no se debe cambiar nada, en este ventana se habilitan opciones
avanzadas, pero esto es para los diseñadores mas experimentados, las necesidades de este
proyecto se satisfacen con las opciones por defecto. La ventana se presenta en la Figura 3.8.
34
Figura 3.8 proyecto wxWidgets parte 7
Al darle clic al botón “Finish” se crearan en la carpeta seleccionada en la Figura 3.4
los siguientes archivos: XXX.cbp, XXX.depend, XXX.layout, XXXApp.cpp, XXXApp.h,
XXXMain.cpp, XXXMain.h. Dentro de un carpeta llamada “wxsmith” debe haber un
archivo llamado “XXXframe.wxs”. Si se encuentran todos estos archivos el proyecto se
creo correctamente. Recordar que en ves de XXX debe estar el nombre del proyecto, para
efectos de este proyecto de ahora en adelante se cambiaran las XXX por UCRASM.
3.2Construcción gráfica
Una de las razones del porque se eligió wxSmith en ves de wxFormBuilder en la
ventana de la Figura 3.6, es que wxSmith trae un pequeño menú por defecto, en esta
35
sección se explicara como manipular la ventana del proyecto y como mejorar el menú que
esta incluido en wxSmith.
Una vez creado el proyecto se abrirá una ventana similar a la mostrada en la Figura
3.9. En la cual se denotan cuatro rectángulos de colores rojo, azul, verde y amarillo, estos
rectángulos muestran las partes principales que se utilizaron en la creación de este proyecto
Figura 3.9 Ventana del Proyecto
3.2.1
Pestañas
En la Figura 3.9 se puede observar tres pestañas, encerradas en un rectángulo rojo,
las cuales son : “Projects”, “Symbols”, “Resources”.
36
3.2.1.1
Projects
En esta pestaña se encuentran los códigos fuente de C++ utilizados en la
construcción del proyecto. UCRASMApp.cpp contiene el programa que empieza toda la
parte gráfica en este código fuente no se debe modificar nada. En UCRASMMain.cpp
representa el programa principal del proyecto, contiene las definiciones de las funciones
que se utilizan en el programa, inicialmente solo tiene el constructor, el destructor, la
función OnQuit y la función OnAbout. En el constructor de la clase no se debe escribir
nada entre el texto “ //(*Initialize(UCRASMFrame) ” y “ //*) ” ya que todo lo que se
escriba ahí, se borrara la próxima ves que se actualicen los widgets. En el constructor
también se guardan la definición de los widgets.
UCRASMApp.h y
UCRASMMain.h son los códigos fuentes las cabeceras de
UCRASMApp.cpp y UCRASMMain.cpp respectivamente, esto significa que en ellos se
guarda la declaración de las clases y de las funciones de cada clase, UCRASMFrame es la
clase que se declara en UCRASMMain.h y UCRASMApp es la clase que se declara en
UCRASMApp.h. Por último se encuentra UCRASMframe.wxs es un código fuente que no
se puede modificar manualmente, conforme se hacen cambios en los widgets se va
actualizando este archivo.
37
3.2.1.2
Symbols
Se pueden ver las funciones que se definen y las variables en esta pestaña. Es una
forma de accesar a esta información mas rápidamente, en caso de que el código sea muy
largo, así se evita perdidas de tiempo. Para brincar a la declaración nada mas se da doble
clic sobre el nombre de la variable o función, y en la pantalla se desplegara el código en
donde se declara.
3.2.1.3
Resources
En la Figura 3.9 se observa donde se selecciona los widgets encerrado por un
rectángulo amarillo, esta junto con la pestaña “Resources” se utilizan para crear y modificar
la interfaz gráfica.
3.2.2
Widgets
Para empezar a crear la interfaz gráfica se debe abrir el archivo, que se encuentra en la
pestaña “Projects”, llamado “UCRASMframe.wxs”, al darle doble clic la parte derecha
cambiara y se presenta como la parte derecha de la Figura 3.9, donde hay un rectángulo con
un fondo blanco con puntos, este es el marco de trabajo. Además se mostrará el
seleccionador de widgets, el cual aparece encerrado por un rectángulo amarillo(Figura 3.9),
tiene varias pestañas con diferentes tipos de widgets. Luego se debe dar clic en la pestaña
“Resources”.
38
Lo primero que se agrega es un widget llamado “wxNotebook”, se encuentra en la
pestaña “Standard” en el seleccionador de widgets, esto se logra dando clic en el botón del
“wxNotebook” y luego dar clic en el marco de trabajo. El widget “wxNotebook” lo que
permite es que se almacenan otros widgets en forma de pestañas. Tiene que verse como en
la Figura 3.10
Figura 3.10 Una vez agregado wxNotebook
Luego se agrega el widget “wxStaticText” que se encuentra en la pestaña
“Standard” en el seleccionador de widgets, de la misma manera que se hizo con el
“wxNotebook”, nada mas que en ves de darle clic al escritorio de trabajo se le da al
“wxNotebook”. El “wxStaticText” se utiliza para mostrar los errores sintácticos que haya a
la hora de compilar.
A este widget se le cambian ciertas características , esto se hace modificando las
casillas que se encuentran encerradas en un rectángulo verde en la Figura 3.9, llamado
39
manejador. Se da clic en el widget al que se le quiere modificar las características , el
manejador cambia dependiendo del widget seleccionado.
Se le debe borrar la casilla “Label”, esto hace que al iniciar el programa no aparezca
nada escrito en el widget “wxStaticText”, en la casilla “Page name” se cambia por “Build
Log”, esto le cambia el nombre permanentemente a la pestaña del widget “wxStaticText”, y
en la casilla “Foreground” se cambia “default” por “Active window caption”, esto hace que
el texto que se escriba aparezca de diferente color. Después de esto debe quedar iguala ala
Figura 3.11
Figura 3.11 Después de agregar el wxStaticText
Para finalizar la interfaz gráfica se le agrega un widget “wxTextCtrl” que se
encuentra en la pestaña “Standard” en el seleccionador de widgets, se hace de la misma
manera que con el “wxStaticText”. “wxTextCtrl” es el widget que da la opción de editar
texto,sin embargo por defecto es una entrada de texto de una sola línea por lo que hay que
40
modificarle ciertas características. En el manejador se modifican las siguientes casillas: la
casilla “Text” se debe borrar, la casilla “Page name” se debe cambiar el contenido por
“Code”, se le debe dar clic a la casilla “Hidden” de tal forma que se agregue un check en
esa casilla, y en la casilla “Style” se deben activar las opciones: wxTE_MULTILINE,
wxTE_RICH, wxTE_RICH2, wxHSCROLL, wxVSCROLL. Estas características lo que
permiten es cambiar una entrada de texto de solo una línea por una entrada de texto
multilínea, que soporte mucho texto, o sea que la longitud máxima sea muy grande, además
permiten que en caso de que el texto es mas grande que la ventana aparezcan barras vertical
y horizontal que permitan al usuario moverse por el texto. Luego de agregar la entrada de
texto y modificarle las características debe observarse como en la Figura 3.12
Figura 3.12 Después de agregar el wxTextCtrl
41
3.2.3
Editor de la barra de menú
Para modificar el menú que por defecto ya esta en el proyecto por haber elegido
wxSmith, se le debe dar doble clic al icono izquierdo que aparece encerrado por un
rectángulo azul en la Figura 3.9, en ese momento se despliega una ventana nueva igual a la
de la Figura 3.13, donde se muestra al lado izquierdo los menús y botones que existen, y al
lado derecho muestra las características de esos menús y botones.
Figura 3.13 Editor de la barra de menú
Para agregar un ítem nuevo se da clic en el botón “New”, con los botones que
contienen flechas y están arriba del botón “New”, se cambia la posición del ítem en la barra
de menú. Con las flechas arriba y abajo, se modifica la posición vertical dentro de la barra
de menú, y con las flechas derecha e izquierda se modifica el ítem, es decir se decide si el
ítem es un menú o un botón. Por ejemplo si a un menú se le mueve hacia la derecha el
42
menú se convierte en un botón, y si a un botón se le mueve hacia la izquierda se convierte
en menú.
Cuando se agrega un ítem se le debe crear un “Id”, eso se logra escribiendo un
nombre en la casilla que dice “Id”, además en la casilla que dice “Label” se llena con el
nombre que se desee para el ítem. La casilla “Accelerator” da la facilidad de escribir una
secuencia de teclas que aceleren un botón, por ejemplo para este proyecto en vez de tener
que buscar en el menú el botón “New” con solo presionar la tecla “F2” se ejecuta la misma
función.
Para este proyecto se agregaron dos menús: “Options” y “Build”. También se
agregó el botón “Refresh” en el menú “Options” , los botones “Check” “Compile” “Run”
“Compile and Run” en el menú “Build” y los botones “New”, “Open”, “Save”,
“SaveAs....”, “Close”, “Exit” en el menú “File”. En la Figura 3.14 se muestra el menú
finalizado.
43
Figura 3.14 Editor de la barra de menú
4. CAPÍTULO 4: Clase y funciones implementadas
Además de la interfaz gráfica el programa tenia que tener código que se ocupara de
manera la parte lógica detrás de la interfaz gráfica, manejar la función de los menús, que se
resaltará el código que se escribiera en la entrada de texto, que se imprimiera la salida en
“Build Log” en caso de errores, etc. Se tuvieron que crear funciones que manejaran toda la
lógica, estas funciones se encuentran declaradas en UCRASMMain.h y definidas en
UCRASMMain.cpp. Fue necesario implementar una clase especial llamada “TRIE”, es una
clase que sirve principalmente para hacer un diccionario
4.1TRIE
TRIE es una estructura de datos que sirve para almacenar cadenas de letras, su
nombre viene de la palabra recuperación en ingles(retrieval). Su estructura es muy similar
a la de un árbol binario, la diferencia es que un nodo(una unidad de almacenamiento de una
estructura de datos) de un TRIE puede tener mas de dos hijos. En la Figura 4.1 se muestra
las dos estructuras, la del lado izquierdo es el árbol binario y la otra es el TRIE. En el TRIE
de la Figura 4.1 se pueden formar 3 palabras con el mismo inicio “pusha”, “pushs”,
“pushf”, además se observa que el ultimo nodo “h” tiene 3 hijos, en realidad un nodo de un
TRIE puede tener hasta 26 hijos ya que este es el número de letras disponibles en el
alfabeto.
44
45
Figura 4.1 Árbol binario y TRIE
Para utilizar el TRIE se creó las funciones “Push”, “CheckC” y “CheckNC”.
4.1.1
Push
“Push”guarda una palabra en el TRIE, por ejemplo si desea guardar la palabra
“pull” en el TRIE de la Figura 4.1. Se verifica si la “p” ya esta en el TRIE, como sí esta se
verifica si la “u” también esta en el TRIE pero tiene que estar después de la “p” en el TRIE,
luego se verifica si la “l” esta en el TRIE después de “pu” como no esta se crea un nodo con
contenido “l” la Figura 4.2 muestra como esta el TRIE después de insertar la “l”.
46
Figura 4.2 TRIE ejemplo después de insertar “pul”
Para la otra “l” de la palabra “pull” ocurre un caso especial, ya que es la ultima letra
de la palabra, entonces al crear el nodo para la “l” se le agrega una característica, llamada
“final”, que indica si el nodo es el ultimo nodo de alguna palabra esto con el objeto de que
“p”,“pu” y “pul” no representen palabras. En la Figura 4.3 se observa la palabra “pull” ya
almacenada en el TRIE.
Figura 4.3 TRIE después de la palabra “pull”
47
4.1.2
CheckNC
Esta función verifica si una palabra se encuentra en el TRIE pero sin tomar en
cuenta mayúsculas y minúsculas. Por ejemplo se desea saber si la palabra “push” esta en el
TRIE de la Figura 4.3. Primero se verifica que se encuentre la letra “p”, como esta se
verifica que ese nodo tenga un hijo con la letra “u”, y a su ves que el ultimo tenga un hijo
con la letra “s”, por ultimo se verifica si el nodo “s” tenga un hijo con la letra “h” y que
además tenga la característica “final” activada, por lo tanto “push” si se encuentra, pero si
se buscara la palabra “pus” sucedería que el nodo “s” no tiene la característica “final”
activada por lo que “pus” no es una palabra valida en el TRIE.
4.1.3
CheckC
Esta función actúa de forma similar a “CheckNC” con la diferencia que si la palabra
a verificar esta en minúscula y aunque su semejante en mayúscula esta en el TRIE, esta
función diría que no se encuentra la palabra. O sea si se busca “push” y en el TRIE esta
“PUSH”, se diría que “push” no se encuentra en el TRIE.
4.2OnQuit
Esta es una función sencilla, es llamada cada vez que el usuario presiona el botón
“Exit” del menú “File” ó el usuario presiona las teclas “Alt + F4”. Cuando la función es
48
llamada ejecuta el comando “exit(0)”. “exit” es una función de la biblioteca “cstdlib” y lo
que hace es terminar el programa normalmente, o sea sin dar ninguna alerta de error.
4.3OnAbout
Es llamada cuando el usuario presiona el botón “About” en el menú “Help” ó
cuando el usuario presiona la tecla “F1”. La función lo que hace es mostrar en una nueva
ventana el mensaje “Made by Emmanuel Barrantes with wxWidgets 2.8.11-Linux-Unicode
build”, la ventan tiene como titulo “Credits”. En la Figura 4.4 se observa la ventana que
aparece al ser llamada esta función.
Figura 4.4 Selector de archivos
4.4OnClose
“OnClose” es llamada cuando el usuario presiona el botón “Close” en el menú
“File” ó cuando el usuario presiona las teclas “Alt + X” ó cuando el usuario presiona el
botón con una “x”, que sirve por lo general para cerrar ventanas. La función verifica que
pestaña el usuario esta tratando de cerrar, si la pestaña es la “Build Log” la función termina
49
el programa, en caso de que sea cualquier otra pestaña la función cierra dicha pestaña y el
programa se sigue ejecutando.
4.5Abrir
Esta función se llama cuando el usuario presiona el botón “Open” en el menú “File”
ó cuando el usuario presiona las teclas “Alt + O” . Al ser llamada esta función desplegara
una ventana donde el usuario puede seleccionar cualquier archivo, la cual se observa en la
Figura 4.5.
Figura 4.5 Selector de archivos
Una vez seleccionado el archivo se abre en modo lectura, luego se crea una pestaña
nueva en el widget “wxNotebook” y la función toma el nombre del archivo para cambiar el
50
titulo de dicha pestaña, después copia todo el contenido del archivo en la nueva pestaña. Al
final llama a la función “RevisarTodo” y cierra el archivo.
4.6Nuevo
Sencillamente esta función crea una nueva pestaña vacía en el widget
“wxNotebook”, y como titulo de la pestaña se escribe la palabra “nuevo”. Para llamar a
esta función, el usuario debe presionar el botón “New” en el menú “File” ó debe presionar
la tecla “F2”. La Figura 4.6 muestra el resultado luego de haberse ejecutado esta función.
Figura 4.6 Nueva pestaña
51
4.7Guardar
Esta función verifica en cual pestaña se esta intentando guardar el contenido, en
caso de que sea la pestaña “Build Log”, la función no realiza ninguna acción, si la pestaña
es una pestaña nueva, no existe un archivo destino en donde se va a guardar el contenido de
la pestaña, por lo que se despliega una ventana para seleccionar el nombre con el que se va
a guardar la pestaña nueva.
En caso de que la pestaña no sea nueva, es decir una pestaña producida por una
función “Abrir”, dicho de otra manera una pestaña que se haya guardado con anterioridad,
lo que significa que ya se tiene el nombre del archivo destino donde se va a guardar el
contenido de la pestaña. En cualquiera de las opciones anteriores, una vez que se tiene el
nombre del archivo destino, se copia el contenido de la pestaña en el archivo, y se cambia
el nombre de la pestaña por el nombre del archivo destino.
Para llamar a esta función el usuario puede presionar el botón “Save” en el menú
“File” ó puede presionar las teclas “Alt + S”.
4.8GuardarComo
Para esta función no importa cual pestaña se vaya a guardar, se puede guardar tanto
una pestaña normal o la pestaña “Build Log”. Una vez llamada, la función despliega una
ventana donde el usuario debe elegir, el nombre con el que se va a guardar el contenido de
la pestaña, luego de que se seleccione, se cambia el titulo de la pestaña por el nombre del
52
archivo elegido. El usuario puede utilizar esta función si presiona el botón “SaveAs....” en
el menú “File” ó puede presionar las teclas “Alt + Shift + S”.
4.9CargarDicc
Esta función busca un archivo llamado “Instrucciones” que debe estar en la misma
carpeta en donde se encuentra el ejecutable “UCRASM”. Si no lo encuentra lo crea, en él
debe encontrarse el repertorio de instrucciones IA32 del lenguaje ensamblador, debe haber
solo una instrucción por línea y las instrucciones deben estar en mayúscula. La función
toma todas las instrucciones del archivo “Instrucciones” y las guarda en una variable
llamada “Diccionario”, esta variable es del tipo TRIE, es decir la función ejecuta el
comando “push” que tiene la clase TRIE, y luego cierra el archivo “Instrucciones”. El
usuario no puede utilizar esta función, cada vez que se inicia el programa por si solo se
llama a esta función.
4.10
CargarReg
Similar que la función “CargarDicc”, solo que en ves de cargar instrucciones esta
función carga los registros del set de instrucciones IA32. De igual manera que en la función
“CargarDicc” esta función busca en la carpeta donde se encuentra el ejecutable, el archivo
se llama “Registros”, en él se debe encontrar los registros, uno por línea, y en mayúscula. Si
el archivo no existe la función lo crea.
53
Los registros que se encuentran en el archivo “Registros” se guardan en una
variable llamada “Registros” y también es del tipo TRIE al final de la función se cierra el
archivo “Registros”. Al igual que en la función “CargarDicc” esta función nunca es llamada
por el usuario, solo se llama una vez al inicio del programa.
4.11
Revisarlinea
Es la función que se encarga de resaltar las instrucciones, registro y comentarios. Si el
usuario hace algún tipo cambio en el texto de alguna de las pestañas, se llamara
automáticamente a la función, el usuario no puede llamar a la función directamente, solo a
través de los cambios que haga en el texto.
Al inicio la función creara unas variables que contiene diferentes colores, estos
colores se utilizaran para cambiar el color de las palabras, solo se cambiaran las palabras
que estén en el diccionario. Estos colores son rojo, azul y verde. Luego se obtiene la línea
en donde el usuario haya realizado un cambio, se separan las palabras de la línea por medio
de los espacios y se almacenan. Si se encuentra un “;” esto significa que es un comentario
por lo que se almacena todo el resto como una sola palabra.
Luego se evalúa palabra por palabra de la línea, primero se verifica si es una
instrucción, un registro, o comentario. En caso de que sea alguna de estas opciones se
cambia el tipo de letra y el color dependiendo de lo que sea la palabra, si es una instrucción
se cambia por azul, si es un registro se cambia por rojo, y si es cualquier otra palabra se
cambia el color por negro. En la Figura 4.7 se observa un ejemplo como queda resaltado el
54
texto en una pestaña, en la Figura se observa que después de un “;” sin importar el texto
que haya queda de color verde.
Figura 4.7 Texto resaltado
4.12
RevisarTodo
Esta función es llamada cuando se abre un archivo, el objetivo es revisar todo el
texto que se acaba de abrir para ver si hay instrucciones, registro y/o comentarios. LA
función recorre línea por línea y ejecuta la función revisar línea. El usuario sí puede utilizar
manualmente esta función, solo debe presionar el botón “Refresh” que se encuentra en el
menú “Options”.
55
4.13
Compilar
Esta función se encarga de crear un ejecutable del programa que se escribió en
ensamblador en una pestaña, utilizando Nasm, el archivo a compilar debe tener una
terminación .asm. El usuario puede hacer uso de esta función si presiona el botón
“Compile” que se encuentra en el menú “Build” ó si presiona las teclas “Ctrl + F9”.
La función primero verifica que el usuario no este intentando compilar la pestaña
“Build Log”, en caso de que sí el programa simplemente no hace ninguna acción, una vez
que se reconoce cual pestaña esta intentando compilar, se verifica que la pestaña ya haya
sido guardada al menos una vez, en caso de que la pestaña sea nueva se despliega una
ventana donde el usuario puede elegir un archivo para compilar. De la pestaña o el archivo
que se intenta compilar, se obtiene el nombre y la ubicación, a la frase “nasm -f elf ” se le
agrega la ubicación del archivo, y a la frase “ld -m elf_i386 -o ” se le agrega el nombre del
archivo y el nombre del archivo con terminación .o . La primera frase es el comando que se
utiliza para llamar a nasm en la terminal de Linux y la segunda frase es el comando que
funciona para enlazar el archivo .o y crear el ejecutable.
Si existe un error con el comando “nasm” esta función no alertara para eso funciona
la función “Check”, pero si existe un error durante el enlazamiento, se alertara por medio
de la pestaña “Build Log”, en esta pestaña se copia todos los errores que se imprimen
normalmente en la terminal de Linux, en caso de que no exista ningún problema en la
56
compilación se imprime un mensaje en la pestaña “Build Log” que dice "Process
terminated with 0 errors" que significa que no hubo ningún error.
Para poder utilizar comandos de Linux en C++ se utilizó una función, llamada
“system”. Esta función recibe una linea con los comandos que se quieren ejecutar en una
terminal de Linux, ejecuta el comando y devuelve un numero dependiendo de como resultó
la ejecución del comando, si el comando en la terminal se ejecutó correctamente la función
devuelve un 0. Para hacer uso de esta función se debe incluir la biblioteca “cstdlib” al inicio
del código fuente.
4.14
Correr
En esta función se ejecuta un programa que ya haya sido compilado correctamente,
de manera que existe un ejecutable de esa pestaña. Para llamar a esta función el usuario
puede presionar el botón “Run” del menú “Build” ó puede presionar las teclas “Ctrl + F10”.
La función verifica que el usuario no este intentando utilizar esta función en la
pestaña “Build Log”, en caso de que sí el programa no ejecuta ninguna acción. Una vez que
se sabe cual pestaña se esta intentando ejecutar, se verifica que la pestaña ya haya sido
guardada con anterioridad al menos una vez, de esta manera se tiene un archivo destino.
En caso de que la pestaña sea nueva se despliega una ventana para que el usuario
elija un archivo, este archivo sera el archivo destino. Con el nombre del archivo destino, se
toma la ubicación del ejecutable, y se ejecuta el programa. En caso de que no exista el
57
ejecutable se imprime el error en la pestaña “Build Log” en donde se indica que el archivo
no existe, en caso contrario se imprime un mensaje en la misma pestaña, “File exists“.
4.15
CompyCor
Es una función muy sencilla que llama a las funciones “Compilar” y “Correr”, en
ese orden, en caso de que el usuario desee ejecutar las 2 funciones, sin tener que hacerlo
individualmente. Para utilizar esta función el usuario puede presionar la tecla “F9” ó puede
presionar el botón “Compile and Run” que se encuentra en el menú “Build”.
4.16
Check
Esta función le permite al usuario revisar la sintaxis de un programa en una pestaña,
sin tener que compilarlo. El usuario puede usar esta función al presionar la tecla “F8” ó
presionar el botón “Check” en el menú “Build”.
Al iniciar la función revisa que el usuario no este posicionado en la pestaña “Build
Log” porque si lo estuviera, la función no realizaría ninguna acción. Luego la función
revisa que el usuario ya haya guardado esa pestaña con anterioridad, ya que si no lo ha
hecho, se abre una ventan donde se le da la opción al usuario de elegir un programa para
revisarle la sintaxis. Se crea la frase “nasm -f elf ” y se le agrega el nombre del programa,
se le pasa como argumento a la función “system”, y si la función “system” devuelve un 0
significa que no tiene errores, pero si la función devuelve cualquier otro numero, hubo un
error de sintaxis y este se desplegara en la pestaña “Build Log”. En caso de que no exista
58
algún error se desplegara en la pestaña “Build Log” el mensaje “Process terminated with 0
errors”.
5. Capítulo 5: Conclusiones y Recomendaciones
5.1Conclusiones

Code::Blocks es en definitiva una herramienta útil que facilitó la creación de la
interfaz gráfica. Ahorrando tiempo a diferencia de haber tenido que crear la interfaz
manualmente escribiendo código de C++ utilizando la biblioteca wxWidgets.

La combinación del lenguaje C++ con la biblioteca wxWidgets resultó conveniente,
ya que el tiempo que se invirtió aprendiendo a utilizarlos fue corto y los problemas
que aparecieron durante la creación del proyecto se resolvieron con ayuda de la
comunidad en internet de C++ y wxWidgets.

Haber realizado este programa bajo el sistema operativo Ubuntu GNU/Linux ofrece
una gran ventaja, , la comunidad de Ubuntu puede realizar mejoras y puede
despulgar el programa.

El programa creado en este proyecto resulta una herramienta simple pero que
cumple con los objetivos estipulados al inicio del proyecto, además se luchó por la
optimización de recursos utilizados por el programa tanto en memoria de ejecución
del programa, como la memoria que ocupa el programa en el disco duro.
59
60
5.2Recomendaciones

La interfaz gráfica del programa cumple de manera funcional sin embargo podría
mejorarse para que sea estéticamente mas agradable para el usuario. Los botones de
los menús puede exponerse de manera diferente, como en un tipo de barra donde
cada botón tenga una Figura que refleje su funcionalidad.

Una limitante que posee el programa es que es exclusivo para el set de instrucciones
IA32, podría modificarse el programa para reconocer instrucciones y registros de 64
bits, ya que el programa aunque fue creado para IA32 fue desarrollado pensando en
posibles expansiones y mejoras.

Se puede mejorar el programa para permitir la interacción del usuario con el
programa en NASM, es decir, crear una forma de que el usuario ingrese
información como se hace en la consola de Ubuntu.

Permitir al usuario pasar parámetros antes de correr un programa, existen programas
donde el usuario debe pasar datos al dar la orden de correr al programa, pro ejemplo
./ “nombre del programa” dato1 dato2.
61
BIBLIOGRAFÍA
1. Catalina Gallego M., Catalina Gallego A. “Unix/Linux Iniciación y referencia”,
McGraw Hill, España, 1999.
2. Deitel H.M., Deitel P.J., “Como programar en C/C++”, Prentice Hall, México,
1994.
3. The NASM Development Team . “NASM — The Netwide Assembler ”, 2011.
4. Canes M., Llamas J. , Rodríguez A., Gasparin L., “Estado del software libre en
el mundo Libre”, http://studies.ac.upc.edu/ALE/ILSLD/PRES1.pdf .
5. Stallman R., “What is Copyleft?”,
http://www.gnu.org/philosophy/philosophy.es.html .
6. http://en.wikipedia.org/wiki/Code::Blocks.
7. Ollivier K.,“History of wxWidgets”, http://www.wxwidgets.org/about/history.htm.
8. http://en.wikipedia.org/wiki/Integrated_development_environment.
9. http://www.ubuntu.com/project/about-ubuntu
10.
http://www.translationdirectory.com/articles/article1702.php
11. Ollivier Kevin ,http://www.wxwidgets.org/
12.
ALEGSA - Santa Fe, Argentina.http://www.alegsa.com.ar/Dic/plataforma.php
62
Glosario
Árbol binario: Es una estructura de almacenamiento que se utiliza al programar en ciertos
lenguajes, para poder llamar a una estructura de esta manera debe satisfacer la regla de que
un nodo solo debe de tener dos nodos hijos.
Apache: Es un servidor HTTP de código abierto.
Bibliotecas: Son códigos y datos que facilitan una labor para un lenguaje de programación.
Bit: Unidad mas pequeña en el sistema de numeración binaria.
Clases: Es un tipo de datos en programación, que puede contener valores, variables,
funciones y estructuras de datos.
Código fuente: Es un archivo con lineas de texto, las cuales poseen instrucciones para la
computadora, que indican como ejecutar un programa.
Compilador: Programa que crea otro programa desde un código fuente.
Constructor: Sirve para inicializar un objeto cuando es creado al programar.
Despulgar: Realizar pruebas con la intención de buscar fallas, faltas y errores en un
programa.
Destructor: Sirve para eliminar objetos en una clase.
Enlazar un programa: Crear un acceso directo a un programa, en Linux
Hardware: Es la parte física de un sistema electrónico.
Instanciar: Es la acción de llamar a una clase durante un programa.
Java: Es un lenguaje de programación creado por Sun Microsystems, similar a C y C++.
63
Lenguaje compilado: Es un lenguaje de programación que utiliza un compilador.
Lenguaje ensamblador: Lenguaje de programación de bajo nivel,
varia según la
arquitectura de la computadora.
Macros: Secciones de código que se utilizan para ahorrar tiempo al programador. El
programador solo escribir el macro una vez. Luego solo necesitara escribir el nombre de un
macro en vez de repetir el código varias veces.
Makefile: Es una herramienta para automatizar código en los sistemas Linux, es un código
con instrucciones que normalmente se utilizan en la terminal.
Nodo: Unidad de almacenamiento en estructuras de datos.
Objeto: Es la instancia de una clase.
Plataformas PC: Es un sistema informático que hace funcionar bloques tanto de hardware
como de software.
Programación orientada a objetos: Un tipo de programación que usa objetos.
Pulgas: Es un nombre que se le da a los errores, faltas y fallas en los programas.
Script: Archivo de texto plano, el cual contiene instrucciones para el sistema operativo.
Shell C: lenguaje de programación desarrollado por Bill Joy, sintaxis similar a la de C. Es
utilizado en Linux.
Software: Es la parte lógica de un sistema informático.
Software privativo: Cualquier programa en donde el usuario posee limitaciones en el uso,
distribución, modificación, y copia del programa.
64
Terminal o consola: Interprete de instrucciones, sirve de interfaz entre el usuario y el
sistema Linux.
Widgets: Componente de control gráfico con el cual el usuario interactúa.
65
ANEXOS
Anexo A: Reporte de pulgas del lenguaje NASM
Se supone que el grupo de Nasm nunca libera versiones con pulgas, que ellos
conozcan, pero como cualquier programa siempre tiene pulgas, pasa que los usuarios
encuentran pulgas que el grupo Nasm desconocen, por lo que existe la alternativa de de que
los usuarios reporten estas pulgas por medio de una sección en la pagina oficial
http://www.nasm.us/, llamada "Bug Tracker".
En la sección 2.2 de la documentación oficial de Nasm se encuentra una lista de
pulgas encontradas, pero son pulgas no solucionadas ya que no afectan grandemente a
Nasm, o sea no se solucionan deliberadamente.
Para reportar una pulga se debe adjuntar la siguiente información:

El sistema operativo en el que se esta corriendo Nasm como Linux, Windows, BSD
Mac Os, etc.

La versión de Nasm que se esta corriendo, como exactamente se esta llamando a
Nasm, o sea los comando que se utilizan para utilizar Nasm.

La versión de cualquier programa suplementario que este usando junto con Nasm y
los comandos que se utiliza para llamarlos desde la terminal. Si los problemas solo
se ven a la hora de enlazar el programa, decir cual enlazador se esta utilizando, qué
versión y los comandos utilizados. Si es un compilador el que se utiliza para enlazar
66
el programa decir cual compilador se esta utilizando, qué versión y los comandos
utilizados.

Si es posible enviar el código fuente del programa en Nasm que esta teniendo
problemas. En caso de que exista problemas de copyright tenga en cuenta dos cosas:
la primera, se garantiza que cualquier código fuente que se envié para despulgar,
sera usado solo con ese fin, y luego sera borrado cualquier copia del código fuente
tan pronto como se encuentren y reparen las pulgas; segundo, el grupo Nasm
prefiere que no le envíen grandes trozos de código, entre mas pequeño mejor.

Una descripción del verdadero problema, una descripción en donde se pueda
entender fácilmente que es lo que pasa que no debería pasar, o que debería pasar, un
ejemplo puede ser: .
“NASM genera un mensaje de error diciendo que el error se encuentra en la línea 3
pero en realidad se encuentra en la línea 5”.

Si la salida que genera el programa es incorrecta también se debe enviar. Eso
ayudara a saber si el problema es de portabilidad entre plataformas.

Cualquier otra información o archivos que pueda ayudar en la búsqueda de la pulga.

Documentos relacionados