Entradas

Mostrando las entradas de 2023

Codigo

Imagen
 

Registros de Emu8086

 2.1. Registros de datos  Los registros de datos son de 16 bits, aunque están divididos. lo que permite su acceso en 8 bits. Estos registros son de propósito general aunque todos tiene alguna función por defecto. AX (acumulador) se usa para almacenar el resultado de las operaciones, es al único registro con el que se puede hacer divisiones y multiplicaciones. Puede ser accedido en 8 bits como AH para la parte alta (HIGH) y AL (LOW) para la parte baja.  BX (registro base) almacena la dirección base para los accesos a memoria. También puede accederse como BH y BL, parte alta y baja respectivamente.  CX (contador) actúa como contador en los bucles de repetición. CL (parte baja del registro) almacena el desplazamiento en las operaciones de desplazamiento y rotación de múltiples bits.  DX (datos) es usado para almacenar los datos de las operaciones.  2.2. Registros de segmento  Los registros de segmento son de 16 bits (como ya se dicho antes) y contienen el valor de segmento. CS (segmento d

Ensamblador

.STACK n sirve para fijar un tamaño n del segmento de pila, por defecto 1K.  .DATA abre el segmento de datos.  .CODE abre el segmento de código, al final código debe aparecer END. .TEXT text le dice al ensamblador que la información que sigue es el texto del programa (instrucciones de montaje), y el código de máquina traducido debe escribirse en el segmento de texto de la memoria. DB, DW y DD se usan para asignar espacio a las variables en memoria. DB tamaño byte, DW tamaño WORD y DD tamaño DWORD. MOV  realiza la transferencia de datos del operando de origen al destino. Como ya hemos visto en  la parte de los modos de direccionamiento, MOV admite todos los tipos de direccionamiento.  Ambos operandos deben ser del mismo tamaño y no pueden estar ambos en memoria. mov rax, 1: Mueve el valor 1 al registro rax, que es utilizado para especificar el número de la llamada al sistema en Linux. mov rdi, 1: Mueve el valor 1 al registro rdi, que es utilizado como el primer argumento de la llamada a

Generación de código objeto

Imagen
 4.1 Registro Los registros son la memoria principal de la computadora. Existen diversos registros de propósito general y otros de uso exclusivo.  Algunos registros de propósito general son utilizados para cierto tipo de funciones. Existen registros acumuladores, puntero de instrucción, de pila, etc.  Distribución La distribución es el proceso en el que el programa generado puede ejecutarse en otras máquinas.  Con respecto al ensamblador, la mayoría del direccionamiento se hace relativo para que el programa sea relocalizable por un programa llamado cargador. En el caso de programas compilados se necesitan de las librerías, si son estáticas se incluyen en el ejecutable por lo que el programa se hace gráfico, si son dinámicas no pero el programa es más pequeño. Debido a la complejidad del software actual se necesitan de asistentes para poder instalar y ejecutar un programa. Operar sobre registros es más rápido y eficiente que operar sobre memoria. Por ello, la adjudicación eficiente de r

comparacion

Imagen
 

III: Optimización

Las optimizaciones pueden realizarse de diferentes formas. Las optimizaciones se realizan en base al alcance ofrecido por el compilador. La optimización va a depender del lenguaje de programación y es directamente proporcional al tiempo de compilación; es decir, entre más optimización mayortiempo de compilación. La optimización es un proceso que tiene a minimizar o maximizar alguna variable de rendimiento, generalmente tiempo, espacio, procesador, etc. 3.1 Tipos de optimización Dentro de los tipos de optimización se derivan los tipos de optimización local, optimización de ciclo, optimización global y optimización de mirilla. 3.1.1 Locales La optimización local se realiza sobre módulos del programa. En la mayoría de las ocasiones a través de funciones, métodos, procedimientos, clases, etc. La característica de las optimizaciones locales es que solo se ven reflejados en dichas secciones. La optimización local sirve cuando un bloque de programa o sección es crítico por ejemplo: E/S, la co

2.3.5 Estructuras

  Las funciones pueden reducir a en línea, lo que se hace que expandir el código original de la función. Las funciones se descomponen simplificando los parámetros de manera individual al igual que el valor de retorno. Entendemos que es el uso de la lengua que hace un hablante. En simples palabras, las funciones del lenguaje son los diferentes objetivos, propósitos y servicio que se le da al lenguaje al comunicarse, dándose una función del lenguaje por cada factor que tiene éste, en donde la función que prevalece es el factor en donde más se pone énfasis al comunicarse. Diversos lingüistas (Karl Bühler, Roman Jakobson, Michael Halliday ) han propuesto distintas clasificaciones de las funciones del lenguaje: Bühler propuso que existían únicamente tres funciones: La Representativa (por la cual se trasmiten informaciones objetivamente) La Expresiva o emotiva (que expresa sentimientos del emisor) La Conativa, mediante la que se influye en el receptor del mensaje a través de órdenes, mandato

2.3.4 Instrucciones de control.

  Esta forma de programación sólo permite resolver problemas sencillos. Para resolver problemas más complejos, nos puede interesar que dependiendo de los valores de los datos, se ejecuten unas instrucciones u otras. Las instrucciones condicionales nos van a permitir representar éste tipo de comportamiento. Sentencias IF y SWITCH. En otros casos, nos encontraremos con la necesidad de repetir una instrucción o instrucciones un número determinado de veces. En éstos casos utilizaremos instrucciones de control iterativas o repetitivas (ciclos). Sentencias WHILE, DO-WHILE y FOR. En los lenguajes de programación hay estructuras y operadores que permiten controlar el flujo de la ejecución, estos pueden ser ciclos, saltos, condiciones entre otros. Expresiones booleanas En los lenguajes de programación, las expresiones booleanas tienen dos propósitos principales. Se utilizan para calcular valores lógicos y como expresiones condicionales en proposiciones que alteran el flujo del control, como las

2.3.3 Instrucción de asignación.

  La sintaxis general de la instrucción de asignación es: nombre_de_la_variable = valor El valor a la derecha del signo igual puede ser una constante, otra variable o una expresión que combine constantes y variables, pero siempre la variable y su valor deben ser del mismo tipo de dato. Ejemplos: edad% = 5 area! = 12.3 nombre$ = “Pedro”  Instrucciones de asignación compuesta Las instrucciones de asignación compuesta realizan primero una operación en una expresión antes de asignarla a un elemento de programación. En el siguiente ejemplo se muestra uno de estos operadores, +=, que incrementa el valor de la variable del lado izquierdo del operador con el valor de la expresión de la derecha. Una instrucción de asignación asigna el valor de una expresión a una variable. En general, si la variable que se va a asignar es una propiedad, la propiedad debe ser de lectura y escritura o de sólo escritura; en caso contrario, se produce un error de compilación. Si la variable es una variable de sólo

2.3.2 expresiones.

  En esta función recibe una cadena que representa una línea de código intermedio y toma las medidas oportunas para que ese código se utilice. Estas medidas pueden ser escribir la línea en un fichero adecuado, almacenar la instrucción en una lista que después se pasará a otros módulos, o cualquier otra que necesitemos en nuestro compilador. Expresiones aritméticas Son aquella donde los operadores que intervienen en ella son numéricos, el resultado es un número y los operadores son aritméticos. Los operadores aritméticos más comúnmente utilizados son: +, - , * , / y %. Comenzamos el estudio por las expresiones aritméticas. Lo que tendremos que hacer es crear por cada tipo de nodo un método que genere el código para calcular la expresión y lo emita. Ese código dejará el resultado en un registro, cuyo nombre devolverá el método como resultado. Para reservar estos registros temporales, utilizaremos una función, reserva. En principio bastar ‘a con que esta función devuelva un registro disti

2.3.1 Variables y constantes

 Variables y constantes • Una constante es un dato numérico o alfanumérico que no cambia durante la ejecución del programa. Ejemplo: pi = 3.1416 • Una variable es un espacio en la memoria de la computadora que permite almacenar temporalmente un dato durante la ejecución de un proceso, su contenido puede cambiar durante la ejecución del programa. Ejemplo: area=pi*radio^2 Las variables son: el radio, el area y la constate es pi • Las declaraciones de variables y constantes deben separarse de tal manera que queden las expresiones una por una de manera simple.

2.3 Esquema de generación.

 Los esquemas de generación son las estrategias o acciones que se deberán realizarse y tomarse en cuenta en el momento de generar código intermedio. Los esquemas de generación dependen de cada lenguaje. Tomaremos algunos esquemas de generación del lenguaje C. Expresiones Instrucciones de control Para generar expresiones estas deben representarse de manera más simple y más literal para que su conversión sea más rápida. Por ejemplo la traducción de operaciones aritméticas debe especificarse una por una, de tal forma que una expresión sea lo más mínimo posible Son aquellas que asignan un valor a una variable o una exprecionejemplo X=23 ó Y=expresion Instruccion de asignacion Las funciones son un grupo de instrucciones con un propocito en general las cuales pueden recibir parametros, mientras que la estructura es un conjunto de datos elementales interelacionados que realizan siertas operaciones entre ellosvariables y constantes Las declaraciones de variables y constantes deben separarse de

2.2.4 cuadruplos

Imagen
  Es una estructura tipo registro con cuatros campos que se llaman: op, arg1, arg2 y resultado. OP tiene un código intermedio. Los operadores unarios como x:=-y no utilizan arg2. Generalmente arg1, arg2 y resultado son valores de tipo puntero y apuntan a una entrada en la tabla de símbolos. Constituida por 4 elementos: un código de operación, dos operando de entrada y otro de salida para almacenar el resultado.

2.2.3 Triplos.

Imagen
  Las proposiciones de tres direcciones se parecen mucho al ensamblador, el cual es un lenguaje intermedio más entendible para la máquina. Las estructuras de control (if, switch, while, do-while, for) son realmente etiquetas goto disfrazadas. El problema de utilizar cuádruplos radica en que se tienen que colocar los valores temporales en la tabla de símbolo. Con una estructura de tres campos se pueden omitir los valores temporales, dicha estructura recibe el nombre de triples y tiene los siguientes campos: op, arg1 y arg2. Generalmente el código que generan los triples recibe el nombre de código de dos direcciones, aunque en ocasiones puede variar. Cuando se utilizan triples se ocupan punteros a la misma estructura de los triples.   * b t1 t2 //cuádruplos.  * b (0) //triple. Se debe tener en cuenta el proceso de asignación, de declaración, expresiones booleanas. Las expresiones lógicas también pueden pasarse a código de tres direcciones, utilizando para ello expresiones en corto circui

2.2.2 codigo p

Imagen
  El código P hace referencia a máquinas que utilizan o se auxilian de pilas para generar código objeto. En muchos caso la P se asociado a código portable el cual garantiza que el código compilado en una máquina se pueda ejecutar en otras. Para garantizar la portabilidad del código se necesita que el len guaje este estandarizado por algún instituto y que dicho código no tenga extensiones particulares. También se recomienda la no utilización de características especiales exclusivas de alguna arquitectura de computadoras en particular.

2.2 representaciones de codigo intermedio

Imagen
  Existen maneras formales para representar código intermedio. Estas notaciones simplifican la traducción de nuestro código fuente a nuestro código objeto ya que ahorran y acotan símbolos de la tabla de símbolos.

Programa

Imagen
 

Evaluación polaca y polaca inv

Imagen
  POST-ORDEN - POLACA INVERSA (87*)63/73/5*3-6++ (8*7)63/73/5*3-6++ (8*7)(6/3)73/5*3-6++ (8*7+6/3)7 3/5*3-6++ (8*7+6/3)(7/3)5*3-6++ (8*7+6/3)(7/3*5)3-6++ (8*7+6/3)(7/3*5-3)6++ (8*7+6/3)(7/3*5-3+6)+ (8*7+6/3)+(7/3*5-3+6)  PRE-ORDEN - POLACA INVERSA ++87/63+-/73536 ++(8*7)/63+-*/73536 ++(8*76/3)+-*/73536 +(8*7+6/3)+-*/73536 +(8*7+6/3)+-*(7/3)536 +(8*7+6/3)+-(7/3*5)36 +(8*7+6/3)+(7/3*5-3)6 +(8*7+6/3)(7/3*5-3+6)- (8*7+6/3)+(7/3*5-3+6)

Notacion Polaca Ejercicio

  Notacion Polaca

Traducción de natación polaca

Imagen
Definition It is a way of expressing arithmetic, logical and algebraic equations. The most basic distinguishing feature is that operators are placed to the left of their operands. If the operator has a defined fixed number of operands, the syntax does not require brackets or parentheses to reduce ambiguity. Polish notation is also known as prefix notation, prefix Polish notation, normal Polish notation, Warsaw notation, and Lukasiewicz notation. Techopedia explains Polish Notation (PN) Polish notation was invented in 1924 by Jan Lukasiewicz, a logician and philosopher, in order to simplify logic. The idea is simply to have a notation without parentheses that makes each equation shorter and easier to parse in terms of defining the evaluation precedence of the operators. Definición  Es una forma de expresar ecuaciones aritméticas, lógicas y algebraicas.  característica distintiva más básica es que los operadores se colocan a la izquierda de sus operandos. Si el operador tiene un número f

Examne 2da unidad

Imagen
  box

ejercicios

Imagen
 ejer 1 / ʌ + x * 2 y - * 4 x 3

Fractal

Imagen
¿QUE ES UN FRACTAL? Un fractal es un objeto geométrico en el que se repite el mismo patrón a diferentes escalas y con diferente orientación. HISTORIA   La expresión fractal viene del latín fractus, que significa fracturado, roto, irregular. La expresión y el concepto se atribuyen al matemático Benoit B. Mandelbrot, y aparecen como tal a finales  de la década de los setenta y principios de los ochenta (Mandelbrot, 1977 y 1982). Anteriormente, los matemáticos Cantor y Peano, entre otros, definen objetos catalogables dentro de esta categoría, pero no son reconocidos como tales. CARACTERÍSTICAS   Si un objeto fractal lo aumentamos, los elementos que aparecen vuelven a tener el mismo aspecto independientemente de cuál sea la escala que utilizamos, y formando parte, como en un mosaico de los elementos mayores. Es decir, estos elementos tienen una estructura geométrica recursiva. Si observamos dos fotografías de un objeto fractal con escalas diferentes (una en metros y otr

Notación polaca inversa

 Definición: ¿Qué significa la notación polaca inversa (RPN)? La notación polaca inversa (RPN) es un método para transmitir expresiones matemáticas sin el uso de separadores como corchetes y paréntesis. En esta notación, los operadores siguen sus operandos, eliminando así la necesidad de corchetes para definir la prioridad de evaluación. La operación se lee de izquierda a derecha, pero la ejecución se realiza cada vez que se alcanza un operador, y siempre utilizando los dos últimos números como operandos. Esta notación es adecuada para computadoras y calculadoras, ya que hay menos caracteres para rastrear y menos operaciones para ejecutar. La notación polaca inversa también se conoce como notación postfix. Techopedia explica la notación polaca inversa (RPN) La notación polaca inversa fue propuesta por Burks, Warren y Wright en 1954 y se llamó así porque era simplemente el reverso de la notación polaca (notación de prefijo), inventada por el lógico polaco Jan Lukasiewicz, que coloca al

Codigo arboles

Imagen
 public class Arbol { private Nodo raiz;         private String cad="";         private int cont=0;          public Arbol(String dato) { raiz=new Nodo(dato); raiz.setIzquierda(null); raiz.setDerecha(null); } public void insertarIzquierda(String dato, Nodo ref) { if(ref!=null) { Nodo nuevo=new Nodo(dato); ref.setIzquierda(nuevo); } } public void insertarDerecha(String dato, Nodo ref) { if(ref!=null) { Nodo nuevo=new Nodo(dato); ref.setDerecha(nuevo); } } public String preOrden(Nodo ref) { if(ref!=null) {                         if(ref==raiz){                             cad="";                         }                       cad=cad+" "+ref.getDato();                          preOrden(ref.getIzquierda()); preOrden(ref.getDerecha()); }                  return cad;  } public String inOrden(Nodo ref) { if(ref!=null) {                         if(ref==raiz){                    

Ejercicios Preorden

Imagen
ejercicio 1: 6,5,3 ejercicio 2: 5,3,4,6,2,7,9 ejercicio 3: 3,6,3,5,1,2,4,1,6,5,7,8 ejercicio 4: F, B, A, D, C, E, G, I, H ejercicio 5: 18,3,2,5,34,20,12,77,40,90 ejercicio en inorden  1: 1,8,7,7,3,6,5 2: 9,22,37,39,44,47,50,66,73,85,88,90,94 

1.7 manejo de errores semánticos

Imagen
 MANEJO DE ERRORES Un compilador es un sistema que en la mayoría de los casos tiene que manejar una entrada incorrecta, sobre todo en las primeras etapas de la creación de un programa, es probable que el compilador se usar para efectuar las características que deberá proporcionar un buen sistema de edición dirigido por la sintaxis, es decir, para determinar si las variables han sido declaradas antes de usarla, o si faltan corchetes o algo as. Por lo tanto, el manejo de errores es parte importante de un compilador y el escritor del compilador siempre debe tener esto presente durante su diseño. Es indispensable que un compilador: Sea capaz de detectar errores en la entrada. El compilador debe recuperarse de los errores sin perder demasiada información. Debe producir un mensaje de error que permita al programador encontrar y corregir fácilmente los elementos incorrectos de su programa. Es una de las misiones ms importantes de un compilador, aunque, al mismo tiempo, es lo que ms dificulta

Pila semántica en un analizador sintáctico

 1.4 Pila semántica en un analizador sintáctico Las pilas y colas son estructuras de datos que se utilizan generalmente para simplificar ciertas operaciones de programación. Estas estructuras pueden implementarse mediante arrays o listas enlazadas. Pila: colección de datos a los cuales se les puede acceder mediante un extremo, que se conoce generalmente como tope. Las pilas tienen dos operaciones  básicas: Push (para introducir un elemento) Pop (para extraer un elemento) Sus características fundamentales es que al extraer se obtiene siempre el último elemento que acabe de insertarse. Por esta razón también se conoce como estructuras de datos LIFO, una posible implementación mediante listas enlazadas seria insertando y extrayendo siempre por el principio de la lista.Las pilas se utilizan en muchas aplicaciones que utilizamos con frecuencia. Las pilas y colas son estructuras de datos que se utilizan generalmente para simplificar ciertas operaciones de programación. Estas estructuras pued