Bienvenidos amigos disfruten de nuestro blog ---

lunes, 9 de julio de 2012


                           Ensamblador

El término ensamblador (del inglés assembler) se refiere a un tipo de programa informático que se encarga de traducir un fichero fuente escrito en un lenguaje ensamblador, a un fichero objeto que contiene código máquina, ejecutable directamente por la máquina para la que se ha generado. El propósito para el que se crearon este tipo de aplicaciones es la de facilitar la escritura de programas, ya que escribir directamente en código binario, que es el único código entendible por la computadora La evolución de los lenguajes de programación a partir del lenguaje ensamblador originó también la evolución de este programa ensamblador hacia lo que se conoce como programa compilador.

Funcionamiento

El programa lee el fichero escrito en lenguaje ensamblador y sustituye cada uno de los códigos nemotécnicos que aparecen por su código de operación correspondiente en sistema binario para la plataforma que se eligió como destino en las opciones específicas del ensamblador
Conjuntos de ensambladores
Podemos distinguir entre tres:
Ensambladores básicos. Son de muy bajo nivel, y su tarea consiste básicamente en ofrecer nombres simbólicos a las distintas instrucciones, parámetros y cosas tales como los modos de direccionamiento. Además, reconoce una serie de directivas (o meta instrucciones) que indican ciertos parámetros de funcionamiento del ensamblador.
Ensambladores modulares, o macro ensambladores. Descendientes de los ensambladores básicos, fueron muy populares en las décadas de los 50 y los 60, antes de la generalización de los lenguajes de alto nivel. Hacen todo lo que puede hacer un ensamblador, y además proporcionan una serie de directivas para definir e invocar macroinstrucciones (o simplemente, macros).
Ensambladores modulares 32-bits o de alto nivel. Son ensambladores que aparecieron como respuesta a una nueva arquitectura de procesadores de 32 bits, muchos de ellos teniendo compatibilidad hacia atrás pudiendo trabajar con programas con estructuras de 16 bits. Además de realizar la misma tarea que los anteriores, permitiendo también el uso de macros, permiten utilizar estructuras de programación más complejas propias de los lenguajes de alto nivel.

Uso del término

Note que, en el uso profesional normal, el término ensamblador es frecuentemente usado tanto para referirse al lenguaje ensamblador como también al programa ensamblador (que convierte el código fuente escrito en el lenguaje ensamblador a código objeto que luego será enlazado para producir lenguaje de máquina). Las dos expresiones siguientes utilizan el término "ensamblador":
•    "El CP/CMS fue escrito en ensamblador del IBM S/360"
•    "El ASM-H fue un ensamblador del S/370 ampliamente usado"
La primera se refiere al lenguaje y el segundo se refiere al programa.

 

Lenguaje ensamblador

El lenguaje ensamblador, o assembler (assembly language en inglés) es un lenguaje de programación de bajo nivel para los computadores, microprocesadores, microcontroladores, y otros circuitos integradosprogramables. Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una arquitectura dada de CPU y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador. Esta representación es usualmente definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria, y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico a cierta arquitectura de computador física (o virtual).
Un programa utilitario llamado ensamblador es usado para traducir sentencias del lenguaje ensamblador al código de máquina del computador objetivo. El ensamblador realiza una traducción más o menos isomorfa (un mapeo de uno a uno) desde las sentencias mnemónicas a las instrucciones y datos de máquina. Esto está en contraste con los lenguajes de alto nivel, en los cuales una sola declaración generalmente da lugar a muchas instrucciones de máquina.
Muchos sofisticados ensambladores ofrecen mecanismos adicionales para facilitar el desarrollo del programa, controlar el proceso de ensamblaje, y la ayuda de depuración. Particularmente, la mayoría de los ensambladores modernos incluyen una facilidad de macro, y son llamados macro ensambladores.
Fue usado principalmente en los inicios del desarrollo de software, cuando aún no se contaba con potentes lenguajes de alto nivel y los recursos eran limitados. Actualmente se utiliza con frecuencia en ambientes académicos y de investigación, especialmente cuando se requiere la manipulación directa de hardware, altos rendimientos, o un uso de recursos controlado y reducido.
Muchos dispositivos programables (como los microcontroladores) aún cuentan con el ensamblador como la única manera de ser manipulados.

Tipos De Ensambladores

Aunque todos los ensambladores realizan básicamente las mismas tareas, podemos clasificarlos de acuerdo a características.
Así podemos clasificarlos en: 

 

Ensambladores Cruzados (Cross-Assembler):


Se denominan así los ensambladores que se utilizan en una computadora que posee un procesador diferente al que tendrán las computadoras donde va a ejecutarse el programa objeto producido.
El empleo de este tipo de traductores permite aprovechar el soporte de medios físicos (discos, impresoras, pantallas, etc.), y de programación que ofrecen las máquinas potentes para desarrollar programas que luego los van a ejecutar sistemas muy especializados en determinados tipos de tareas.

Ensambladores Residentes:


Son aquellos que permanecen en la memoria principal de la computadora y cargan, para su ejecución, al programa objeto producido. Este tipo de ensamblador tiene la ventaja de que se puede comprobar inmediatamente el programa sin necesidad de transportarlo de un lugar a otro, como se hacía en Cross-assembler, y sin necesidad de programas simuladores.
Sin embargo, puede presentar problemas de espacio de memoria, ya que el traductor ocupa espacio que no puede ser utilizado por el programador. Asimismo, también ocupará memoria el programa fuente y el programa objeto. Esto obliga a tener un espacio de memoria relativamente amplio. Es el indicado para desarrollos de pequeños sistemas de control y sencillos automatismo empleando microprocesadores.
La ventaja de estos ensambladores es que permiten ejecutar inmediatamente el programa; la desventaja es que deben mantenerse en la memoria principal tanto el ensamblador como el programa fuente y el programa objeto.

Macroensambladores:

Son ensambladores que permiten el uso de macroinstrucciones (macros). Debido a su potencia, normalmente son programas robustos que no permanecen en memoria una vez generado el programa objeto. Puede variar la complejidad de los mismos, dependiendo de las posibilidades de definición y manipulación de las macroinstrucciones, pero normalmente son programas bastantes complejos, por lo que suelen ser ensambladores residentes.

Microensambladores:

Generalmente, los procesadores utilizados en las computadoras tienen un repertorio fijo de instrucciones, es decir, que el intérprete de las mismas interpretaba de igual forma un determinado código de operación.
El programa que indica al intérprete de instrucciones de la UCP cómo debe actuar se denomina microprograma. El programa que ayuda a realizar este microprograma se llama microensamblador. Existen procesadores que permiten la modificación de sus microprogramas, para lo cual se utilizan microensambladores.

Ensambladores de una fase:

Estos ensambladores leen una línea del programa fuente y la traducen directamente para producir una instrucción en lenguaje máquina o la ejecuta si se trata de una pseudoinstrucción. También va construyendo la tabla de símbolos a medida que van apareciendo las definiciones de variables, etiquetas, etc.
Debido a su forma de traducción, estos ensambladores obligan a definir los símbolos antes de ser empleados para que, cuando aparezca una referencia a un determinado símbolo en una instrucción, se conozca la dirección de dicho símbolo y se pueda traducir de forma correcta. Estos ensambladores son sencillos, baratos y ocupan poco espacio, pero tiene el inconveniente indicado.

Ensambladores de dos fases:

Los ensambladores de dos fases se denominan así debido a que realizan la traducción en dos etapas. En la primera fase, leen el programa fuente y construyen una tabla de símbolos; de esta manera, en la segunda fase, vuelven a leer el programa fuente y pueden ir traduciendo totalmente, puesto que conocen la totalidad de los símbolos utilizados y las posiciones que se les ha asignado. Estos ensambladores son los más utilizados en la actualidad.

Ensambladores de alto nivel

Los más sofisticados ensambladores de alto nivel proporcionan abstracciones del lenguaje tales como:
•    Estructuras de control avanzadas
•    Declaraciones e invocaciones de procedimientos/funciones de alto nivel
•    Tipos de datos abstractos de alto nivel, incluyendo las estructuras/records, uniones, clases, y conjuntos
•    Procesamiento de macros sofisticado (aunque está disponible en los ensambladores ordinarios desde finales 1960 para el IBM/360, entre otras máquinas)
•    Características de programación orientada a objetos

Número de pasos

Hay dos tipos de ensambladores basados en cuántos pasos a través de la fuente son necesarios para producir el programa ejecutable.

•    Los ensambladores de un solo paso pasan a través del código fuente una vez y asumen que todos los símbolos serán definidos antes de cualquier instrucción que los refiera.
•    Los ensambladores de los dos pasos crean una tabla con todos los símbolos y sus valores en el primer paso, después usan la tabla en un segundo paso para generar código. El ensamblador debe por lo menos poder determinar la longitud de cada instrucción en el primer paso para que puedan ser calculadas las direcciones de los símbolos.

La ventaja de un ensamblador de un solo paso es la velocidad, que no es tan importante como lo fue en un momento dado los avances en velocidad y capacidades del computador. La ventaja del ensamblador de dos pasos es que los símbolos pueden ser definidos dondequiera en el código fuente del programa. Esto permite a los programas ser definidos de maneras más lógicas y más significativas, haciendo los programas de ensamblador de dos pasos más fáciles leer y mantener.

Características


El código escrito en lenguaje ensamblador posee una cierta dificultad de ser entendido ya que su estructura se acerca al lenguaje máquina, es decir, es un lenguaje de bajo nivel.
El lenguaje ensamblador es difícilmente portable, es decir, un código escrito para un microprocesador, puede necesitar ser modificado, para poder ser usado en otra máquina distinta. Al cambiar a una máquina con arquitectura diferente, generalmente es necesario reescribirlo completamente.
Los programas hechos por un programador experto en lenguaje ensamblador son generalmente mucho más rápidos y consumen menos recursos del sistema (memoria RAM y ROM) que el programa equivalente compilado desde un lenguaje de alto nivel. Al programar cuidadosamente en lenguaje ensamblador se pueden crear programas que se ejecutan más rápidamente y ocupan menos espacio que con lenguajes de alto nivel.
Con el lenguaje ensamblador se tiene un control muy preciso de las tareas realizadas por un microprocesador por lo que se pueden crear segmentos de código difíciles y/o muy ineficientes de programar en un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje ensamblador se dispone de instrucciones del CPU que generalmente no están disponibles en los lenguajes de alto nivel.
También se puede controlar el tiempo en que tarda una rutina en ejecutarse, e impedir que se interrumpa durante su ejecución.

Programa ensamblador

Típicamente, un programa ensamblador (assembler en inglés) moderno crea código objeto traduciendo instrucciones mnemónicas de lenguaje ensamblador en opcodes, y resolviendo los nombres simbólicos para las localizaciones de memoria y otras entidades.El uso de referencias simbólicas es una característica clave del lenguaje ensamblador, evitando tediosos cálculos y actualizaciones manuales de las direcciones después de cada modificación del programa. La mayoría de los ensambladores también incluyen facilidades de macros para realizar sustitución textual.
Los ensambladores son generalmente más simples de escribir que los compiladores para los lenguajes de alto nivel, y han estado disponibles desde los años 1950. Los ensambladores modernos, especialmente para las arquitecturas basadas en RISC, tales como MIPS, Sun SPARC, y HP PA-RISC, así como también para el x86 (-64), optimizan la planificación de instrucciones para explotar la segmentación del CPU eficientemente.

En los compiladores para lenguajes de alto nivel, son el último paso antes de generar el código ejecutable.

Instrucciones básicas de assembler


20 - ADD [mem]:Sumar: AX = AX + el contenido de la dirección de memoria
60 - ADDF [mem]:Suma números de 32 bits: En BX y AX queda el resultado de la suma de estos más elcontenido de [mem] y mem+1
11 - AND [dest,orig]:Y lógico, hace un Y lógico entre todos los bits de los dos operandos escribiendo elresultado en el destino. Los parámetros pueden ser direcciones de memoria o Registros.
04 - CLA: Hace AX = 0
25 - CLC:Limpia el Carry Flag. C = 0
27 - CMC:Complementa (invierte) el Carry Flag. Si C = 1 vuelve C = 0 y viceversa.
32 - CMP [mem]:Compara AX con [mem], si AX es mayor, Z=0 N=0, si es igual Z=1 N=0, si es menor Z=0 N=1
09 - DEC [dest]:Decremento en 1 el destino especificado (Si el destino queda = 0, se vuelve Z = 1)
23 - DIV [mem]:Dividir: AX = AX / el contenido de la dirección de memoria, BX=AX % el contenido de la dirde memoria (BX = modulo o residuo).
63 - DIVF [mem]:Division: BX y AX = BX y AX / [mem]y mem+1, en CX queda el residuo de la divisionenentero de 16 bits
41 - EAP:Escribe en Pantalla el contenido del registro AX
65 - FTOI:Conversión de Real a Entero: Convierte un número Real(32bits) a su equivalente en entero BX yAX en un entero (16bits), el Resultado queda en AX. Los registros de control cambian de acuerdo al numeroconvertido: "Z" si el numero es cero, "N" si el numero es negativo, "O" si el número real es mayor de 65535
99 -HLT:Terminar Programa( todo programa lleva esta instrucción para indicarle al simulador que el programa ha terminado su ejecución)
80 - IN [registro,Puerto]:Lleva al Registro el valor retornado por el puerto especificado
08- INC [dest]:Incrementa en 1 el destino especificado, el parámetro puede ser una dirección de memoriao un registro.
64 -ITOF:Conversión de Entero a Real: Convierte un número entero (16bits) almacenado en AX al mismonúmero pero representado en Real IEEE754 (32bits), el Resultado de la conversión queda en BX (bits massignificativos) y AX. Los registros de control cambian de acuerdo al número convertido: "Z" si el número escero, "N" si el numero es negativo.
35 - JC [mem]:Saltar si el Carry Flag esta activado. Si C = 1, PC = contenido de memoria
31 - JEQ [mem]:Saltar si son iguales Si Z = 1, PC = contenido de la memoria.
34 - JMA [mem]:Saltar si es Mayor. Si Z = 0 y N = 0, PC = contenido de memoria.
33 - JME [mem]:Saltar si es Menor. Si N = 1, PC = contenido de la memoria
30 - JMP [mem]:Salto incondicional. PC = dirección de memoria donde está la siguiente instrucción aejecutar"
36 - JNC [mem]:Saltar si el CarryFlag no esta activado. Si C = 0, PC = contenido de memoria
39 - JNE [mem]:Saltar si no son iguales. Si Z = 0, PC = contenido de memoria
38- JNO [mem]:Saltar si el OverflowFlag no esta activado. Si O = 0, PC = contenido de memoria
37 - JO [mem]:Saltar si el OverflowFlag esta Activado
01 - LDA [mem]:Cargue en AX el contenido de la dirección de Memoria especificada. (hay casos donde esmejor usar MOV si se desea pasar datos sin tener que pasarlos por AX)
50 –LDB[mem]:La instrucción carga en AX el contenido de memoria almacenado en [mem] + BX
55 –LDF[mem]:Carga en BX y AX un numero de 32 bits (IEEE) que esta almacenado en la dir [mem] ymem+1. En BX quedan los digitosmas Significativos
40 -LDT:Lee un valor del Teclado y lo lleva al registro AX
29 - LOOP [mem]:Decrementa CX y salta a la Pos de memoria si CX no es cero.
10 - MOV [dest,orig]:Copia el valor almacenado en el origen al destino. El destino y/o origen pueden serregistros o direcciones de memoria o combinación de estos.
42 -MSG:Muestra un mensaje en pantalla
22 -MUL [mem]:Multiplicar: AX = AX * el contenido de la dirección de memoria.(Si el número resultantesupera su longitud en binario de 16 bits, este resultado se parte almacenando los bits más significativos en el Registro BX.)
62 - MULF [mem]:Multiplicación: BX y AX = BX y AX * [mem]y mem+1 
90 -NOP:Esta operación no hace nada.
12 - NOT [destino]:NO lógico, invierte los bits del operando formando el complemento del primero.
13 - OR [dest,orig]:O inclusive lógico, todo bit activo en cualquiera de los operándoos será activado en eldestino
81 - OUT puerto,registro:Escribe en el puerto especificado, el valor del registro
07 - POP [registro]:Trae de la Pila el último valor llevado por PUSH (indicado por el registro SP) y loalmacena en el registro especificado.
06 - PUSH [registro]:Envía el valor del registro especificado a la pila
15 - ROL [dest,veces]:Rota los bits a la izquierda las veces especificadas(en decimal), los bits que salen porla izquierda re-entran por la Derecha. En el Carry Flag queda el último bit rotado.
16 - ROR [dest,veces]:Rota los bits a la derecha las veces especificadas(en decimal), los Bits que salen por laderecha re-entran por la izquierda. El Carry Flag guarda el último bit rotado.
17 - SHL [dest,veces]:Desplaza los bits a la izquierda el número de veces especificado(en decimal),agregando ceros a la derecha, el Carry Flag guarda ultimo bit desplazado.
18- SHR [dest,veces]:Desplaza los bits a la Derecha el número de veces especificado(en decimal),agregando ceros a la izquierda, el Carry Flag guarda ultimo bit desplazado.
02 - STA [mem]:Guarde el contenido de AX en la dirección de Memoria especificada
51 –STB[mem]:guarda el contenido de AX en la dirección [mem] + BX
26 -STC: Pone el Carry Flag. C = 1
56 - STF [mem]:Guarda en [mem] y mem+1 el contenido de BX y AX
21 - SUB [mem]:Restar: AX = AX - el contenido de la dirección de memoria
61 - SUBF [mem]:Resta el numero de 32 bits: BX y AX = BX y AX - [mem] y mem+1
03 - XAB:Intercambia los valores de los registros AX y BX (Esta instrucción no necesita parámetros.)
14- XOR [dest, orig]:Oexclusivo, realiza unOexclusivo entre los operándos y almacena el resultado endestino.
 



Ejemplos

Suma:
cla;
ldt;
mov 10,ax;
msg +;
ldt;add 10;
msg =;
eap ;
hlt;



Resta:

cla;
ldt;
movB,ax;
msg -;
ldt;
movC,ax;
movax,B;
msg =sub C;
eap;
hlt


Multiplicación:

cla;
ldt;
mov 9,ax;
msg *;
ldt;
mul 9;
msg =;
eap ;
hlt;



División:

cla;
ldt;
movB,ax;
msg /;
ldt;
movC,ax;
movax,B;
div C;
msg =;
eap;
hlt;

Importancia del lenguaje ensamblador

La importancia del lenguaje ensamblador radica principalmente que se trabaja directamente con el microprocesador; por lo cual se debe de conocer el funcionamiento interno de este, tiene la ventaja de que en el se puede realizar cualquier tipo de programas que en los lenguajes de alto nivel no lo pueden realizar. Otro punto sería que los programas en ensamblador ocupan menos espacio en memoria.
Ventajas
El proceso de evolución trajo consigo algunas desventajas, que ahora veremos cómo las ventajas de usar el Lenguaje Ensamblador, respecto a un lenguaje de alto nivel:

Ventajas generales:

Mayor control de la computadora.
Independencia de lenguaje.
La mayoría de las computadoras pueden ensamblar.
Los programas hechos en lenguaje ensamblador son generalmente más rápidos y consumen menos recursos del sistema.

Ventajas especificas:

Velocidad: el proceso de traducción que realizan los intérpretes, implica un proceso de cómputo adicional al que el programador quiere realizar. Por ello, nos encontraremos con que un intérprete es siempre más lento que realizar la misma acción en Lenguaje Ensamblador, simplemente porque tiene el costo adicional de estar traduciendo el programa, cada vez que lo ejecutamos.

De ahí nacieron los compiladores, que son mucho más rápidos que los intérpretes, pues hacen la traducción una vez y dejan el código objeto, que ya es Lenguaje de Máquina, y se puede ejecutar muy rápidamente. Aunque el proceso de traducción es más complejo y costoso que el de ensamblar un programa, normalmente podemos despreciarlo, contra las ventajas de codificar el programa más rápidamente.
Sin embargo, la mayor parte de las veces, el código generado por un compilador es menos eficiente que el código equivalente que un programador escribiría. La razón es que el compilador no tiene tanta inteligencia, y requiere ser capaz de crear código genérico, que sirva tanto para un programa como para otro; en cambio, un programador humano puede aprovechar las características específicas del problema, reduciendo la generalidad pero al mismo tiempo, no desperdicia ninguna instrucción, no hace ningún proceso que no sea necesario.
Para darnos una idea, en una PC, y suponiendo que todos son buenos programadores, un programa para ordenar una lista tardará cerca de 20 veces más en Visual Basic (un intérprete), y 2 veces más en C (un compilador), que el equivalente en Ensamblador.
Por ello, cuando es crítica la velocidad del programa, Ensamblador se vuelve un candidato lógico como lenguaje.
Ahora bien, esto no es un absoluto; un programa bien hecho en C puede ser muchas veces más rápido que un programa mal hecho en Ensamblador; sigue siendo sumamente importante la elección apropiada de algoritmos y estructuras de datos. Por ello, se recomienda buscar optimizar primero estos aspectos, en el lenguaje que se desee, y solamente usar Ensamblador cuando se requiere más optimización y no se puede lograr por estos medios.

Tamaño: por las mismas razones que vimos en el aspecto de velocidad, los compiladores e intérpretes generan más código máquina del necesario; por ello, el programa ejecutable crece. Así, cuando es importante reducir el tamaño del ejecutable, mejorando el uso de la memoria y teniendo también beneficios en velocidad, puede convenir usar el lenguaje Ensamblador. Entre los programas que es crítico el uso mínimo de memoria, tenemos a los virus y manejadores de dispositivos (drivers). Muchos de ellos, por supuesto, están escritos en lenguaje Ensamblador.
Flexibilidad: las razones anteriores son cuestión de grado: podemos hacer las cosas en otro lenguaje, pero queremos hacerlas más eficientemente. Pero todos los lenguajes de alto nivel tienen limitantes en el control; al hacer abstracciones, limitan su propia capacidad. Es decir, existen tareas que la máquina puede hacer, pero que un lenguaje de alto nivel no permite. Por ejemplo, en Visual Basic no es posible cambiar la resolución del monitor a medio programa; es una limitante, impuesta por la abstracción del GUI Windows. En cambio, en ensamblador es sumamente sencillo, pues tenemos el acceso directo al hardware del monitor.
Resumiendo, la flexibilidad consiste en reconocer el hecho de que
todo lo que puede hacerse con una máquina, puede hacerse en el lenguaje ensamblador de esta máquina; los lenguajes de alto nivel tienen en unas u otras formas limitantes para explotar al máximo los recursos de la máquina.




Desventajas

Desventajas generales:

Demasiado complejo.
Comprensión más profunda de la computadora.
Errores más frecuentes en el programa.
Mayor tiempo de codificación.
Difícilmente portable, es decir, un código escrito para un microprocesador en particular necesita ser modificado muchas veces en su totalidad para poder ser usado en otro microprocesador.

Desventajas especificas:

Tiempo de programación: al ser de bajo nivel, el Lenguaje Ensamblador requiere más instrucciones para realizar el mismo proceso, en comparación con un lenguaje de alto nivel. Por otro lado, requiere de más cuidado por parte del programador, pues es propenso a que los errores de lógica se reflejen más fuertemente en la ejecución.
Por todo esto, es más lento el desarrollo de programas comparables en Lenguaje Ensamblador que en un lenguaje de alto nivel, pues el programador goza de una menor abstracción.

Programas fuente grandes: por las mismas razones que aumenta el tiempo, crecen los programas fuentes; simplemente, requerimos más instrucciones primitivas para describir procesos equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los programas, y nuevamente reduce la productividad de los programadores.

Peligro de afectar recursos inesperadamente: tenemos la ventaja de que todo lo que se puede hacer en la máquina, se puede hacer con el Lenguaje Ensamblador (flexibilidad). El problema es que todo error que podamos cometer, o todo riesgo que podamos tener, podemos tenerlo también en este Lenguaje. Dicho de otra forma, tener mucho poder es útil pero también es peligroso.

En la vida práctica, afortunadamente no ocurre mucho; sin embargo, al programar en este lenguaje verán que es mucho más común que la máquina se "cuelgue", "bloquee" o "se le vaya el avión"; y que se reinicialice. ¿Por qué?, porque con este lenguaje es perfectamente posible (y sencillo) realizar secuencias de instrucciones inválidas, que normalmente no aparecen al usar un lenguaje de alto nivel.
En ciertos casos extremos, puede llegarse a sobrescribir información del CMOS de la máquina (no he visto efectos más riesgosos); pero, si no la conservamos, esto puede causar que dejemos de "ver" el disco duro, junto con toda su información.
Falta de portabilidad: como ya se mencionó, existe un lenguaje ensamblador para cada máquina; por ello, evidentemente no es una selección apropiada de lenguaje cuando deseamos codificar en una máquina y luego llevar los programas a otros sistemas operativos o modelos de computadoras. Si bien esto es un problema general a todos los lenguajes, es mucho más notorio en ensamblador: yo puedo reutilizar un 90% o más del código que desarrollo en "C", en una PC, al llevarlo a una RS/6000 con UNIX, y lo mismo si después lo llevo a una Macintosh, siempre y cuando esté bien hecho y siga los estándares de "C", y los principios de la programación estructurada. En cambio, si escribimos el programa en Ensamblador de la PC, por bien que lo desarrollemos y muchos estándares que sigamos, tendremos prácticamente que reescribir el 100 % del código al llevarlo a UNIX, y otra vez lo mismo al llevarlo a Mac.

No hay comentarios:

Publicar un comentario