UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA ELO311 Estructuras de Computadores
|
|
- Tomás Montoya Martin
- hace 8 años
- Vistas:
Transcripción
1 6.5. Comunicación de las funciones con su entorno. Hasta el momento se ha conceptualizado una subrutina como un segmento de código que ocurre a menudo en un programa. La idea puede flexibilizarse y aumentar el poder de las subrutinas, pasándole parámetros y retornando valores; de esta manera, el código de una subrutina modela al concepto de función. Las subrutinas permiten darle estructura a las acciones, facilitando la comprensión del algoritmo. Es decir, permiten descomponer un todo complejo, en partes más simples que tienen un nombre abstracto que recuerda la subacción que realizan. Un motivo frecuente de errores es que las subrutinas tengan efectos laterales, es decir que modifiquen otras variables, generalmente por alcance de nombres. Pare evitar esto se adoptó la política de pasarle los datos de entrada como argumentos y que la función retorne el resultado, ojalá en registros. La mayor ventaja de esto es que el código interno de la función puede cambiarse y no afectará al resto del programa. Además de permitir el reusar las funciones en otros programas. La metodología anterior también generó dificultades, ya que si se cambian las estructuras de los datos, deben rescribirse, o modificarse las funciones que los manipulan. Actualmente los datos y las funciones que los procesan están encapsulados en un objeto, ésta es la idea básica en la programación orientada a objetos, que fue una refinación del concepto de módulos, que ya se empleaba en programación. Una función, entonces, efectúa el cálculo de un valor en términos de sus argumentos; por ejemplo, una función y, con argumentos x1, x2 y x3 puede anotarse: y = f(x1, x2, x3). En el lenguaje C, sólo se tienen funciones a las que se les pasa argumentos por valor. Es decir, los argumentos de la función son números (técnicamente son expresiones). Y también la función sólo retorna un valor; de este modo una función es una abstracción de una expresión. Esta aparente limitación, es debida a que el lenguaje fue desarrollado para ser fácilmente compilado en lenguajes de máquina. Como veremos este modelo, tiene una implementación simple en assembler. Se estudiarán tres casos típicos; el primero, una función sin argumentos; el segundo, paso de argumentos por valor; y el tercero, paso de argumentos por referencia. Prof. Leopoldo Silva Bijit
2 Comunicación por variables globales. En este caso, la función no requiere argumentos y tampoco un valor de retorno. Entonces puede leerse valores, dentro de la función, desde las variables ya existentes; y escribir los resultados en una o varias de las variables externas. Éstas pueden estar en registros o en la zona estática de datos. Esta forma puede provocar, lo que se denomina efectos laterales (por escribir en una variable que empleará otra función más adelante, o por leer una variable que otra función modificó con otro sentido), y no es recomendada. Sin embargo su utilidad es reducir el código de entrada y salida de una subrutina. Descripción en C. int i, j, k; /*definición de variables globales*/ /*Definición de la función */ void f1(void) /*argumentos y resultados en globales*/ { k = i + j; } main( ) {... f1( ); /*aquí se invoca a la subrutina o función f1 sin argumentos */... /*aquí debería retornar a ejecutar la siguiente sentencia */ } La primera ocurrencia de la palabra void(vacío en español) indica que la función f1 no retorna un valor; cuando void aparece en lugar de los argumentos, indica que a la función no se le pasan parámetros. Representación en assembler:.data i:.word 0x0 #definición de variables globales (estáticas) j:.word 0x0 k:.word 0x0 main:.text.globl main #se especifica tipo de rótulo... jal f1 # invocación de la función (por su dirección).... # se guarda en ra, la dirección de la instrucción después del jal. j main # se vuelve a repetir la función principal. Observación. La decisión del salto a main es para simplificar el empleo del simulador. El texto en C indica que en este lugar debería retornarse de la función main, y volver al sistema operativo, desde donde se ejecutó el programa. De esta manera se impide la ejecución de instrucciones después de la última ensamblada; ya que siempre habrá algo en la memoria, después de la última instrucción cargada. Esto vuelve a repetir el programa. Prof. Leopoldo Silva Bijit
3 La codificación que traduce el programa en C, es ejecutar un llamado al sistema que retorne al programa que invocó a main (syscall #10). Esto viene incorporado en el trap handler. Si lo que se desea es detener la ejecución, a pesar de seguir ejecutando paso a paso, una alternativa es colocar: stop: j stop # esto cuelga al procesador. (hang-up) Definición de la función. Veamos ahora el código de la función en assembler. #definición de la función f1: la $t0, i # t0 apunta a variable i (se usa una macro). t0 = &i lw $s1, 0($t0) # s1 = i lee desde la memoria las variables lw $s2, 4($t0) # s2 = j add $t1, $s1, $s2 # t1 = i + j sw $t1, 8($t0) # k = t1 escribe en variable en memoria jr $ra # retorna a la instrucción siguiente al jal. Estrategias para el uso de registros. En máquinas con registros numerosos de propósito general se intenta mantener en registros las variables de uso más frecuente, y se colocan en memoria el resto de las variables (si son más numerosas que los registros disponibles). Entonces se emplea load para mover esas variables a registros, y luego de manipularlas, mediante store almacenarlas en la memoria. Esto implica mayor tiempo de proceso, por esto es conveniente tener una estrategia para ocupar de manera eficiente los registros. Por otro lado, si están ocupados los registros, es preciso pasar alguna variable a memoria, para disponer de éstos; se denomina derramar registros (spilling registers) a este proceso. Y éste es uno de los usos del stack. En MIPS, se pasan los argumentos en los registros $a0, $a1, $a2, $a3, y las funciones pueden retornar resultados en los registros $v0 y $v1, es decir, son funciones expandidas que pueden retornar dos valores. Si se requieren más argumentos debe empujárselos (derramarlos) al stack antes de la invocación. Es importante entender que los valores almacenados en registros, por el texto que llama a un procedimiento (llamador), deben contener lo mismo después del retorno del procedimiento (llamado) si se vuelven a emplear en el texto que invocó a la subrutina. Una forma primitiva para evitar corromper el estado de los registros es: llamador: salvar en stack todos los registros(derrame total) Prof. Leopoldo Silva Bijit
4 invocar restaurar todos los registros. Pero esto es muy ineficiente, ya que habrán registros que pueden no emplearse dentro de la función. Una alternativa, en algunos procesadores es emplear varios bancos de registros (solución que emplea, por ejemplo el 8051, y que consiste en disponer de diversos grupos de todos los registros de propósito general), mediante una instrucción se cambia de banco, y el texto llamado dispone de todos los registros. Al retornar, se vuelve a activar el banco original. La siguiente descripción conceptual destaca este hecho: llamador: se usan registros con argumentos se escribe en ciertos registros deben salvarse registros que se escriban en el texto del llamado deben salvarse argumentos que se ocupen después del retorno del llamado y que se escriban en la siguiente fase. se prepara invocación cargando argumentos se invoca se almacena valores de retorno se recuperan argumentos que vuelvan a ser leídos en fases siguientes se restauran contenidos de registros que sean leídos luego en el llamador pueden volver a ocuparse los argumentos originales pueden volver a ocuparse registros en los que se hubieran depositado valores. Para organizar el manejo de los registros, en MIPS, se tienen dos grupos de registros, los t, por temporales ($t0 hasta $t9), y los s por salvados ($s0 hasta $s7). Y se emplea el siguiente convenio: El llamado puede emplear los temporales; es decir escribir en ellos. Y no es preciso que los salve y restaure. El que llama debe salvar, al inicio, los registros s en que escriba. Y antes de salir debe restaurar dichos registros. El que llama debe salvar, antes de invocar, los registros t que tengan valores que ocupe después del llamado, y que se hayan modificado en la función llamada. Luego del retorno debe restaurar dichos registros Comunicación por argumentos. Paso por valor. En este caso se coloca como ejemplo una función que retorna un valor, y a la cual se le pasan argumentos en forma de números (por valor). Prof. Leopoldo Silva Bijit
5 Descripción en C. int i, j, k; /* globales */ register int f2(register int a0, register int a1) /* a0 y a1 son parámetros formales */ { return (a0+a1); } main() {... k = f2(i, j); /* invocación a f2 con parámetros actuales i y j. Pueden ser expresiones*/... } A la función f2 se le pasan como argumentos, los valores de las variables globales i y j. La palabra register le indica al compilador que los argumentos deben pasarse vía registros. El resultado de la función, que debe devolverse en un registro, se almacena en k. Nótese que una función es una expresión, con valor perteneciente al tipo de la función. En invocaciones por valor, puede pasarse una expresión, por ejemplo f2(i+5, j-2). Codificación en assembler..data i:.word 0x0 j:.word 0x0 k:.word 0x0.text.globl main main:... la $t0, i # lw $a0,0($t0) # a0 = i Carga de valores. lw $a1,4($t0) # a1 = j jal f2 # invocación de función sw $v0,8($t0) # k = v0 Almacenar resultado retornado.... j main Observaciones. La pareja de instrucciones: la $t0, i # a0 = i lw $a0, 0($t0) Prof. Leopoldo Silva Bijit
6 Puede reemplazarse por la macro: lw $a0, i(0) También la pareja de instrucciones: la $t0, i # sw $v0,8($t0) # k = v0 Puede reemplazarse por la macro: sw $v0,k(0) Definición de la función f2 # Argumentos en registros a0 y a1. # Resultado de la función en registro v0. # v0 = f2(a0, a1) f2: add $v0, $a0, $a1 #La función comienza en la dirección f2. jr ra Notesé que antes y después del jal, en la secuencia de instrucciones que implementan el llamado a la función, existe código para pasar argumentos y procesar el resultado de la función. Todo esto involucra un costo en tiempo y espacio en memoria para procesar funciones. En los argumentos se colocan valores, y la función también retorna un valor Comunicación por argumentos. Paso por referencia. En el ejemplo que veremos en este caso los argumentos son direcciones de variables. Por esta razón se definen como variables de tipo puntero. El modelo sigue siendo de paso por valor, pero lo que se pasa ahora es el valor de un puntero; es decir, una dirección. El siguiente es un ejemplo que ilustra los conceptos anteriores. Código en C. int i, j, k; register int f3(register int *a0, register int *a1) { return (*a0+*a1); } /*argumentos por referencia*/ main() {... k= f3(&i,&j); /*Invocación. Paso de las direcciones de las variables*/... } Prof. Leopoldo Silva Bijit
7 Codificación en assembler. Variables.data i:.word 0x0 j:.word 0x0 k:.word 0x0 Invocación..text.globl main main:... la $a0,i #carga punteros. Se pasa una referencia a las variables. la $a1,j #En los argumentos se pasan valores de punteros. jal f3 #invocación de función sw $v0,k(0) # k = v0 (es una macro)... j main Definición. f3: lw $t1,0($a0) # t1 = i lw $t2,0($a1) # t2 = j add $v0,$t1,$t2 jr ra Observación. La utilidad de pasos por referencia es que se puede escribir en las variables externas, y a la vez no se crea espacio en el stack, ni es necesario copiar los valores de los argumentos en el stack. En el ejemplo, sólo se leen variables pasadas por referencia. Se puede modificar el valor de una variable pasada por referencia; por ejemplo si se desea escribir el registro t5 en la variable i, puede escribirse, dentro de la subrutina: sw $t5, 0($a0) # i = t5 o bien, con notación de punteros: *a0 = t5 siempre y cuando no se altere el puntero a0, desde que se le cargó la dirección de i. Suele también utilizarse pasos por referencia, si la función debe retornar más de un valor Administración de la Memoria. Se definen, al menos, cuatro segmentos de memoria. Algunos registros del procesador se emplean para apuntar a dichos segmentos. Prof. Leopoldo Silva Bijit
8 En uno de ellos se almacenan las instrucciones, es el segmento de texto. Este segmento puede estar en Eprom. O en la misma memoria RAM en que se almacenan los datos. El registro PC apunta a la instrucción que se está ejecutando. En otro segmento se almacena datos estáticos y constantes. Es el segmento de datos. Las constantes (mensajes, prompts, etc., pueden estar en Eprom) no cambian durante la ejecución del programa. Las variables que estén visibles durante toda la ejecución del programa suelen estar en RAM. Aquí se almacenan variables tipificadas como estáticas en C. En el caso del MIPS, se dispone de un registro que apunta a esta zona, para facilitar el direccionamiento de estas variables y/o constantes (se denomina $gp global pointer). En general todas las variables externas a las funciones de C, ocupan esta zona. Todas las variables, en esta zona, son conocidas en el momento de la compilación. Otro segmento usual es el de datos dinámicos o heap. Esta zona se utiliza mediante llamados a malloc y free en C. Las variables a esta zona están referenciadas por punteros existentes en la zona estática. Finalmente se define un segmento de Stack. En él se almacenan las variables automáticas de C, es decir los argumentos (que no puedan pasarse en registros) y las variables locales (que requieran estar en memoria por no haber registros disponibles o por ser locales de funciones recursivas). En general las locales suelen ser registros temporales. Cada función tiene un espacio donde almacena dichas variables, que se denomina frame. En este espacio también suele guardarse la dirección de retorno de la función. Una vez terminada la ejecución de una función, el frame se desactiva, y el espacio queda disponible para ser reutilizado. Las variables, que se almacenan en el stack, existen sólo durante el momento en que está activa la función que las creó (por esto se llaman automáticas). Este espacio es referenciado mediante dos registros: sp (stack pointer) y fp (frame pointer). En el caso de microcontroladores existen más segmentos. Ya que éstos pueden tener ROM y RAM interna al chip, y externa a éste. En estos casos es importante especificar claramente en qué segmento se tendrá los elementos que se ocuparán. En el caso del procesador MIPS, se dispone del siguiente esquema de memoria: El simulador asume por defecto que el texto comienza en 0x , el segmento de datos estático, comienza en 0x Y el stack comienza en 0x7fffffff, y crece hacia direcciones menores. Prof. Leopoldo Silva Bijit
9 La zona desde 0x hasta la zona de texto, no puede ser empleada por datos o instrucciones del usuario. Están reservadas para el sistema operativo. Las direcciones: 0xffff000c, 0xffff0008, 0xffff0004, 0xffff0000 se emplean en un dispositivo de entrada salida, orientado al carácter, en el simulador SPIM. E/S mapeada en memoria Zona de Stack $fp 0x7fffffff $sp heap Segmento de Datos 0x las direcciones aumentan 0x Segmento de Texto Reservado. Sistema Operativo $gp $pc En el esquema de memoria las direcciones crecen hacia arriba. A continuación se desarrolla un ejemplo que ilustra el uso del stack Desarrollo de programas. Primer programa del apéndice A. (del texto guía) Generar la suma de los cuadrados de los números de 0 a 100. Primero escribiremos un algoritmo en lenguaje C, luego traduciremos el texto C a assembler; esta operación se denomina compilar. Se describe una rutina para imprimir en la consola del simulador, a través de llamados al sistema. El ejemplo muestra que una manera eficiente de describir un programa assembler Prof. Leopoldo Silva Bijit
10 es a través de un lenguaje de alto nivel. Esta manera es mejor que emplear un diagrama de flujo. El programa en C, que se coloca como descripción del algoritmo, puede probarse en un computador que tenga un compilador C y genere un ejecutable que corra en ese computador, para de este modo asegurar que cumple las especificaciones, antes de comenzar el proceso de traducción. Programación assembler. #void main(void) # { register unsigned int i; # register unsigned int suma=0; # for(i=0; i<=100; i++) suma=suma+i*i; # printf("\nla suma de los cuadrados de los números de 0 a 100 es %d",suma); # } # #************************************************************************.data mensaje:.asciiz "\nla suma de los cuadrados de los números de 0 a 100 es: " main:.text.globl main addiu $sp, $sp,-4 #push ra sw $ra, 0($sp) #salva dirección de retorno. Main invoca a subrutina. #variables locales en registros. addu $t0, $zero, $zero # $t0 = i = 0 addu $t1, $zero, $zero # $t1= suma = 0 for: sltiu $t2, $t0,101 # i <101 => $t2 =1 beq $t2, $zero, fin multu $t0, $t0 # HI-LO = i*i mflo $t2 add $t1, $t1, $t2 # $t3 = suma + i*i addiu $t0, $t0, 1 # i = i+1 j for fin: la $a0, mensaje # printd(mensaje,suma) addu $a1, $zero, $t1 jal printd lw $ra, 0($sp) # restaura ra Prof. Leopoldo Silva Bijit
11 addiu $sp, $sp, 4 # pop jr $ra # retorna desde main. El programa principal (main) se trata como una subrutina, que es invocada por el sistema operativo, o un cargador de programas. Se asume que existe una zona de stack, previamente definida. El puntero apunta al último ocupado. Por esta razón la operación push primero decrementa el stack pointer, y luego almacena el registro ra en la memoria; salvando así la dirección de retorno. De esta forma se posibilita que una subrutina llame a otras. Note la existencia de la instrucción jal, dentro del código de main. Al ingresar a la subrutina se salva la dirección de retorno en el stack, antes de salir de la subrutina se restaura el valor del registro ra, y se reposiciona el stack pointer. #**********************************************************************# # printf( $a0 %d,$a1); # #**********************************************************************# #imprime mensaje apuntado por $a0, seguido de número decimal en $a1 printd: addiu $sp, $sp,-12 #crea espacio del frame de 12 bytes. sw $ra, 0($sp) #salva dirección de retorno #debug para ver argumento decimal de printd en stack sw $a0, 4($sp) #salva arg sw $a1, 8($sp) #salva a1 en frame li $v0, 4 #imprime string en $a0 syscall move $a0, $a1 #macro li $v0, 1 #imprime decimal en $a1 syscall lw $ra, 0($sp) addiu $sp, $sp, 12 jr $ra #y retorna. La subrutina printd, reserva un espacio o frame para mantener en direcciones adyacentes los valores de los argumentos con que trabajará. Es usual que los argumentos y variables locales de una subrutina se almacenen en el stack, en procesadores que no tienen un número elevado de registros de propósito general. En el ejemplo no hay variables locales, sólo argumentos. Prof. Leopoldo Silva Bijit
12 Esta forma de proceder crea una localidad espacial de los datos; lo cual, como se verá más adelante, es el fundamento para el empleo de memoria caché. Los siguientes diagramas, ilustran el stack, antes del llamado a printd y después de haber creado el frame y haber almacenado los valores de los argumentos. sp dirección de retorno de main disponible sp dirección de retorno de main valor de a1 valor de a0 dirección de retorno de printd disponible En la subrutina printd, no se emplean los valores almacenados en el stack. Sólo se ilustra la creación de un frame. Debe notarse el código para la creación del frame, y su recuperación antes de salir. Después de salir de printd, main vuelve a encontrar su frame en iguales condiciones que antes de invocar a printd. Compilación. La misma tarea de traducir el texto fuente en C a assembler de MIPS, se puede lograr con un compilador cruzado en un computador que no tenga un procesador MIPS. El siguiente es el código generado por el compilador lcc. Se le han agregado algunos comentarios para hacerlo más legible. Debe notarse el uso de directivas assembler (comienzan con un punto); y también que es un assembler numérico. Los rótulos son generados automáticamente, algunos no se emplean (como L.3). El compilador lcc no emplea el frame pointer..set reorder.globl main.text.text.align 2.ent main main:.frame $sp,32,$31 #especifica tamaño del frame addu $sp,$sp,-32 #crea espacio para el frame.mask 0xc ,-8 #indica los registros que deben salvarse. Usa máscara binaria(32 bits) sw $23,16($sp) #salva registros 23, 30 y 31 Prof. Leopoldo Silva Bijit
13 sw $30,20($sp) sw $31,24($sp) move $23,$0 move $30,$0 b L.5 L.2: mul $24,$30,$30 #inicia en cero el 23 y lo usa para local suma #inicia en cero el 30 y lo usa para local i #L.5 es un rótulo de un instrucción # temporal = i*i addu $23,$23,$24 # suma = suma + temporal L.3: la $30,1($30) # le suma 1 a i y lo deja en $30 L.5: la $24,100 #temporal = 100 bleu $30,$24,L.2 la $4,L.6 move $5,$23 jal printf L.1: lw $23,16($sp) lw $30,20($sp) lw $31,24($sp) addu $sp,$sp,32 j $31.end main.rdata.align 0 L.6:.byte 10.byte 76.byte 97.byte 115.byte 117.byte 109.byte 97.byte 100.byte 101.byte 108.byte 111.byte 115.byte 99.byte 117 #carga en a0 dirección de inicio del string #carga en a1 el valor entero #recupera registros #retorno # código ascii de \n expresado con valor decimal # código ascii de L # código ascii de a Prof. Leopoldo Silva Bijit
14 .byte 97.byte 100.byte 114.byte 97.byte 100.byte 111.byte 115.byte 100.byte 101.byte 108.byte 111.byte 115.byte 110.byte 250.byte 109.byte 101.byte 114.byte 111.byte 115.byte 100.byte 101.byte 48.byte 97.byte 49.byte 48.byte 48.byte 101.byte 115.byte 37.byte 100.byte 0 #fin de string Nótese la falta de legibilidad del string generado por lcc para el mensaje: mensaje:.asciiz "\nla suma de los cuadrados de los números de 0 a 100 es: " Prof. Leopoldo Silva Bijit
15 6.8. Función recursiva. Manejo y administración de frames, en el stack. Hasta el momento se han visto los siguientes usos para el stack: Guardar direcciones de retorno de subrutinas, salvar y restaurar registros, almacenar los valores de los argumentos de las subrutinas. Se verá a continuación otro uso para el stack, que es almacenar las variables locales de las subrutinas (variables automáticas en C); esto permite crear subrutinas recursivas. Un programa es recursivo, si dentro de su bloque de acciones se llama a sí mismo. Como veremos, las variables locales y argumentos deben crearse en el stack. Si por ejemplo las variables estuvieran en el segmento estático de datos, sólo podría existir una copia de una variable. Cada vez que se invoca a una rutina recursiva, se crea un frame asociado que contiene espacio para las variables locales; de este modo las diversas ejecuciones del único código que implementa la rutina operan sobre sus propias variables. En el ejemplo, la invocación de f(5) crea una variable n, en el stack; pero esta invocación genera el llamado f(4), que a su vez crea otra variable n, en el stack. A las sucesivas instancias de n, en el stack, se las denomina encarnaciones. Y la re-ejecución del texto de la función recursiva se podría llamar clonación. Una de las principales características de los programas recursivos, es que debe existir una alternativa codificada en términos de los argumentos de la función que terminen las invocaciones recursivas. En el caso del ejemplo en C, si n es menor o igual que cero, no se produce un llamado recursivo, y la función termina. Al terminar desaparecen las variables automáticas (las guardadas en el stack). También se denominan funciones reentrantes, a las que mantienen sus propias variables en su frame. Esto posibilita que dos procesos invoquen a una misma función, cuyo código es compartido. Las funciones del sistema operativo se diseñan como reentrantes. Se emplea como ejemplo el cálculo de n!. Código en C. # #include <stdio.h> # int fact(int n) # { if (n>0) return( n*fact(n-1) ); else return( 1); } # void main(void) # { printf("\nel factorial de 3 es: %d", fact(3)); } Prof. Leopoldo Silva Bijit
16 Código en assembler..data mensaje:.asciiz "\nel factorial de 3 es: ".text.globl main main: subu $sp, $sp, 4 #push ra sw $ra, 0($sp) #acciones de main li $a0, 3 # pasa constante 3 como argumento de fact jal fact move $a1, $v0 # el retorno de fact se lleva al argumento a1 de printd la $a0, mensaje # argumento a0 de printd. Imprime salida de fact jal printd lw $ra,0($sp) #restaura ra addu $sp,$sp,4 jr $ra #retorna de main El programa principal salva en el stack la dirección de retorno solamente. La rutina fact, guarda en el stack el argumento n y la dirección de retorno. ################################################################# # $v0 = fact( $a0) # ################################################################# fact: subu $sp, $sp, 8 #crea espacio para n y ra (8 bytes) sw $ra, 0($sp) #acciones de fact sw $a0, 4($sp) # salva a0 en frame. Inicia argumento. lw $v0, 4($sp) bgtz $v0, ifpos # salta si positivo li $v0, 1 # f(0)=1 j salirfact ifpos: lw $v1, 4($sp) # v1 = n subu $v0, $v1, 1 # v0 = n - 1 move $a0, $v0 jal fact # fact(n-1) lw $v1, 4($sp) # v1 = n Prof. Leopoldo Silva Bijit
17 mul $v0, $v0, $v1 # v0 = fact(n-1)*n salirfact: lw $ra, 0($sp) #restaura ra addu $sp, $sp,8 jr $ra #retorna de fact No se muestra el código de printd, ya que es la misma subrutina vista antes. Se reutiliza el código. La siguiente tabla muestra el estado del stack, después del llamado fact(0). La última columna muestra hacia donde apunta el stack pointer, cuando está ejecutando el código de una subrutina. Cuando se sale de una subrutina, y se vuelve a la que llamó, se reajusta el puntero sp. Dirección Contenido Observaciones valor de sp 0x7fffefd8 0x PC después del jal fact en fact(0). dentro de fact(0) 0x7fffefdc 0x salva valor de a0 cuando invoca fact(0) 0x7fffefe0 0x PC después del jal fact en fact(1). dentro de fact(1) 0x7fffefe4 0x salva valor de a0 cuando invoca fact(1) 0x7fffefe8 0x PC después del jal fact en fact(2). dentro de fact(2) 0x7fffefec 0x salva valor de a0 cuando invoca fact(2) 0x7fffeff0 0x PC después del jal fact en main. fact(3) dentro de fact(3) 0x7fffeff4 0x salva valor de a0 cuando invoca fact(3) 0x7fffeff8 0x PC después de jal main. (código de arranque) dentro de main 0x7fffeffc 0x SP apunta aquí antes de invocar a main 6.9. Sobre los argumentos de main y el código de arranque. El trap handler carga en las primeras posiciones del segmento de texto el siguiente código (de arranque):.text 0x globl start start: lw $a0, 0($sp) # a0 = argc addiu $a1, $sp, 4 # a1 = sp + 4 addiu $a2, $a1, 4 sll $v0, $a0, 2 # v0 = argc*4 addu $a2, $a2, $v0 # a2 = argc*4 + sp+8 jal main li $v0,10 # retorno al monitor syscall Prof. Leopoldo Silva Bijit
18 Su finalidad es pasarle a main sus argumentos. En el lenguaje C, se le pueden pasar argumentos en la línea de comandos a un programa. Esto se logra con los argumentos de main, que pueden describirse según: int main(int argc, char *argv[ ] ) Cuando el programa es compilado y ligado, se genera un ejecutable con un nombre que el programador elige (en ambiente PC sea nprog.exe el nombre asignado; a.out por defecto en Unix). Se lo carga en memoria y se lo ejecuta llamándolo por su nombre; y podrían agregarse algunos string que se denominan argumentos. Un ejemplo con dos argumentos es: nprog argumento1 argumento2 Por convenio argc (cuenta el número de argumentos, incluido el nombre del programa), en el caso del ejemplo toma valor 3. Si no hay argumentos argc vale 1. El nombre del programa es reconocido como argv[0], en el ejemplo argv[1] = "argumento1", y argv[2] es igual al string "argumento2". Note que argv[1] es un puntero a char. Además en este caso, argv[argc] es un puntero nulo a carácter; esto por convenio. Note que argv es un arreglo (con dimensión fijada automáticamente) de punteros a char. Entonces, dentro de main, puede efectuarse un procesamiento de los argumentos. Un uso frecuente es pasar nombres de archivos. Por ejemplo, puede imprimirse el primer argumento mediante: if (argc >1 ) printf("%s", argv[1]); El loader, cargador de programas, lee el nombre del programa y los argumentos, solicita memoria en forma dinámica y almacena los argumentos en strings terminados en nulo; y va empujando en el stack la dirección de los strings, partiendo por el último argumento. Lo primero que se empuja es un puntero nulo. Visualmente, la estructura del arreglo de punteros a char, puede representarse por: argv nprog\0 argumento1\ argumento2\ En el simulador SPIM se empujan sólo las direcciones de los strings argumentos propiamente tales (no el nombre del programa) y la cuenta de éstos. En el menú simulator, Prof. Leopoldo Silva Bijit
19 activando go, se despliega una ventana con la dirección de inicio y una casilla para entrar los argumentos. Se inicia el stack del modo siguiente: Prof. Leopoldo Silva Bijit
20 argc dirección string primer argumento dirección string segundo argumento... dirección string último argumento 0x tope stack antes de llamar a main Direcciones aumentan. sp a1 a2 Stack después de jal main. $a0 contiene argc. $a1 apunta al puntero al primer argumento. $a2 apunta al tope del stack antes de llamar a main. Los argumentos a0, a1 y a2 son iniciados por el código de arranque. El siguiente programa en C, emplea los argumentos de main, y los imprime. Código en C. ##include <stdio.h> #int main (int argc, char * argv[]) # { int i; # if (argc==1) {printf("\nno hay argumentos"); return(1);} # for( i=0; i<argc; i++) printf("\n%s", argv[i]); # return(0); # } Se traduce a assembler, contemplando que los argumentos se introducen empleando el comando go. Código en assembler..data noargs:.asciiz "\nno hay argumentos" newline:.asciiz "\n".text.globl main main: subu $sp, $sp, 4 #push ra sw $ra, 0($sp) #a0 = argc a1 = argv[0] move $s0,$a0 # salva a0 move $s1,$a1 # salva a1 #acciones de main Prof. Leopoldo Silva Bijit
21 li $t0,0 beq $t0,$s0, nohay li $t0,0 #t0 = i lazo: slt $t1,$t0,$s0 #t1 =1 si i<argc beq $t1,$zero,salir lw $a0,0($s1) # a0 = argv[t0] jal prints addiu $s1,$s1,4 addi $t0,$t0,1 j lazo nohay: la $a0, noargs # argumento a0 de prints. jal prints li $v0,1 j fuera salir: li $v0,0 fuera: lw $ra,0($sp) #restaura ra addu $sp,$sp,4 jr $ra #retorna de main #**********************************************************************# # printf("\n%s",$a0); # #**********************************************************************# prints: move $a1,$a0 #salva a0. la $a0,newline # # li $a0,0x0a li $v0, 4 #imprime \n syscall move $a0,$a1 #recupera a0 li $v0, 4 #imprime string en $a0 syscall jr $ra #y retorna. Prof. Leopoldo Silva Bijit
22 6.10. Convenio de llamadas a funciones. Preservación de los registros. Un grado de flexibilidad adicional, se logra disponiendo un registro denominado fp(por frame pointer), además de los registros: pc, sp, ra. La finalidad de este puntero es facilitar, a los compiladores, el direccionamiento de los argumentos y variables locales de una función. Además permite direccionar variables de rutinas, que tengan su frame activo, y que se hayan invocado antes. No todos los compiladores emplean dicho registro. En caso de no hacerlo, deben llevar la cuenta si dentro de la subrutina varía el stack pointer, para el direccionamiento de las variables locales y argumentos allí almacenadas. El compilador lcc, no emplea el frame pointer. A continuación veremos algunos conceptos generales sobre los frames de funciones, empleando un puntero al frame, o registro de activación de una función. Se denomina frame, al espacio contiguo de variables y argumentos de una función. Todas las variables almacenadas en el frame, existen mientras esté activa la función. Son las variables automáticas de C. Direcciones altas +4($fp) 0($fp) 32($sp) a4-4($fp) 28($sp) variable local 1-8($fp) 24($sp) variable local 2-12($fp) 20($sp) variable local 3-16($fp) 16($sp) variable local 4-20($fp) 12($sp) para salvar registros s -24($fp) 8($sp) para salvar registros s -28 ($fp) 4($sp) fp -32($fp) 0($sp) ra relativas a fp relativas a sp Direcciones Contenidos Direcciones más bajas $fp Tope Stack $sp Antes de crear el frame, se asume que el sp apunta al tope. La última palabra del frame activo, del que llama. El frame pointer, después de creado el frame apunta al último concepto empujado en el stack antes de invocar. Prof. Leopoldo Silva Bijit
23 Se ilustra un frame de 8 palabras (32 bytes) después de fijar el nuevo tope de stack y el nuevo frame pointer. Lo cual permite guardar 6 enteros, que pueden ser registros s o variables locales; además se almacenan ra y fp. En el frame de ejemplo que se ilustra, se considera salvar dos registros s y disponer de 4 variables locales. Las variables locales son necesarias si no alcanzan los registros t y los s que se salvaron; en este caso el acceso a las locales en memoria es más lento que a las locales en registros. También son indispensables en caso de funciones recursivas. En la columna de direcciones, se establecen las referencias respecto del fp, y también respecto de sp. No suelen plantearse respecto de sp, ya que éste puede variar durante la ejecución de la función. Por ejemplo, puede utilizarse el stack, para evaluar expresiones o condiciones complejas, o para salvar algún recurso. Debe cuidarse, en caso de usar el stack, durante las acciones de la función, de emparejar los push con los pop, dentro de la subrutina. En el momento de la compilación, pueden ubicarse todas las variables locales y los argumentos (almacenados en el stack), con direccionamiento relativo a fp. Dentro del frame, suelen guardarse fp y ra en posiciones fijas. Facilitando de este modo el acceso a variables locales de frames anteriores, mediante un direccionamiento indirecto. Por ejemplo, si uno desea usar la primera variable local del frame anterior y depositarla en el registro temporal t1, puede efectuar: lw $t1,-28($fp) # en t1 copia valor de fp anterior lw $t1,-4($t1) Cada compilador tiene una estructura determinada del frame, y ésta debe conocerse si se desea escribir una función en assembler que sea compatible. Es decir, que pueda invocarse desde el programa en C. Un esquema general para rutinas que llaman a otras rutinas, es el siguiente: laquellama: subu $sp, $sp, 32 # crea espacio de 32 bytes (8 palabras) sw $ra, 0($sp) sw $fp, 4($sp) addu $fp, $sp, 32 # fija $fp #acciones de la que llama. lw $t0,... #modifican temporales add $t1,... # salva temporales que quiera usar después del llamado. addiu $sp, $sp,-8 # push sw $t0, 0($sp) # salva valores vivos en sitio del que llama. sw $t1, 4($sp) # caller-save Prof. Leopoldo Silva Bijit
24 # puede salvar argumentos actuales move $a0,... #paso de argumentos vía registros move $a1,... move $a2,... move $a3,... addiu $sp,$sp,-4 # push argumento sw valor argumento4, 0($sp) jal llamado #aquí pueden usarse los valores de retorno. addiu $sp, $sp, 4 # pop argumento lw $t0, 0($sp) #recupera conceptos lw $t1, 4($sp) #recupera argumentos actuales, si los guardó. addiu $sp, $sp, 8 # libera espacio #siguen acciones del que llama. Puede seguir usando $t0 y $t1 lw $fp, 4($sp) # restaura frame pointer anterior. lw $ra, 0($sp) # recupera ra addu $sp,$sp,32 # desaparecen automáticas. jr $ra # retorna de laquellama De acuerdo al convenio caller-save, una rutina que llama a otra (laquellama) tiene la responsabilidad de salvar los registros temporales que desee usar después del llamado; así también los valores corrientes de los argumentos, si desea usarlos después del llamado. Luego debe pasar los argumentos, de preferencia en registros; pero si se requieren más de cuatro (a0, a1, a2, a3) debe pasarlos en el stack. Después del llamado, están a disposición los valores retornados (v0, v1). También tiene la responsabilidad de recuperar los registros temporales y argumentos, y ajustar el registro sp. De acuerdo al convenio calle-save, la rutina que es llamada tiene la responsabilidad de salvar los registros s que ella emplee, y también la de restaurarlos. Si la rutina que hemos denominado llamado, a su vez llama a otra, debe cumplir el convenio caller-save. Ambas rutinas deben crear y desarmar el frame. Guardando las direcciones de retorno y el frame pointer. llamado: subu $sp,$sp,tf #tf=4*palabras del frame. Crea frame. sw $ra, 0($sp) sw $fp, 4($sp) addu $fp, $sp, tf #fija nuevo fp Prof. Leopoldo Silva Bijit
25 #salva registros s que use el llamado sw $s0, 8($sp) sw $s1, 12($sp) #acciones del llamado. Puede usar libremente registros $ti # pueden emplearse variables locales con referencias a fp #en este ejemplo se usan s0 y s1(se los sobreescribe) add $s0,... lw $s1,... #escribe resultados add $v0,... lw $v1,... lw $s0, 8($sp) # restaura callee-save lw $s1, 12($sp) lw $ra, 0($sp) # restaura ra lw $fp, 4($sp) # recupera frame anterior addu $sp, $sp, tf # desarma frame jr $ra # retorna de llamado En compiladores que usen efectivamente el frame pointer, las referencias a las variables locales y argumentos, pueden realizarse con direccionamiento relativo a $fp. El compilador también puede calcular el tamaño del frame. Prof. Leopoldo Silva Bijit
Funciones. Diseño de funciones. Uso de instrucción jal y retorno de subrutina.
MIPS Funciones 1 Funciones Diseño de funciones. Uso de instrucción jal y retorno de subrutina. Se suelen denominar funciones, procedimientos, subrutinas, subprogramas a las estructuras que emplean los
Más detallesIntroduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia
Introduccion al Lenguaje C Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia Introducción C es un lenguaje de programación creado en 1972 por
Más detallesTema 2: Arquitectura del repertorio de instrucciones. Visión del computador que tiene el programador en bajo nivel.
Tema 2: Arquitectura del repertorio de instrucciones Visión del computador que tiene el programador en bajo nivel. Lo que el programador en lenguaje ensamblador debe conocer para escribir programas: (1)
Más detallesEstructura de Computadores
Estructura de Computadores 4.- Programación en Ensamblador Parte IV Contenido Subrutinas. Llamadas al sistema. Página 2 Subrutinas Módulos de programa que pueden reutilizarse en distintos puntos del programa.
Más detallesModulo 1 El lenguaje Java
Modulo 1 El lenguaje Java 13 - Codificación en Java Una de las grandes diferencias entre Java y Pascal en cuando a la codificación es que Java se trata de un lenguaje de los llamados case sensitive Esto
Más detallesCentro de Capacitación en Informática
Fórmulas y Funciones Las fórmulas constituyen el núcleo de cualquier hoja de cálculo, y por tanto de Excel. Mediante fórmulas, se llevan a cabo todos los cálculos que se necesitan en una hoja de cálculo.
Más detallesGuía Laboratorio Número 1
Guía Laboratorio Número 1 Página 1 de 5 Arquitectura de Computadoras 06/04/2014 Repaso lenguaje ensamblador Escribir códigos en lenguaje ensamblador es bastante sencillo, por lo que no es necesario el
Más detallesIlustrar el mecanismo de llamadas al sistema para solicitar servicios al sistema operativo.
Práctica 1: introducción al simulador SPIM 1. Motivación Seguro que a estas alturas de la carrera sabe ya manejar un ordenador perfectamente. Incluso debe saber cómo programarlos en un lenguaje de alto
Más detallesSISTEMA InfoSGA Manual de Actualización Mensajeros Radio Worldwide C.A Código Postal 1060
SISTEMA InfoSGA Manual de Actualización Mensajeros Radio Worldwide C.A Código Postal 1060 Elaborado por: Departamento de Informática Febrero 2012 SISTEMA InfoSGA _ Manual de Actualización 16/02/2012 ÍNDICE
Más detallesInstrucción IrA (GoTo). Saltos no naturales en el flujo normal de un programa. Pseudocódigo y diagramas de flujo. (CU00182A)
aprenderaprogramar.com Instrucción IrA (GoTo). Saltos no naturales en el flujo normal de un programa. Pseudocódigo y diagramas de flujo. (CU00182A) Sección: Cursos Categoría: Curso Bases de la programación
Más detallesCapitulo V Administración de memoria
Capitulo V Administración de memoria Introducción. Una de las tareas más importantes y complejas de un sistema operativo es la gestión de memoria. La gestión de memoria implica tratar la memoria principal
Más detallesPROPUESTAS COMERCIALES
PROPUESTAS COMERCIALES 1. Alcance... 2 2. Entidades básicas... 2 3. Circuito... 2 3.1. Mantenimiento de rutas... 2 3.2. Añadir ofertas... 5 3.2.1. Alta desde CRM... 5 3.2.2. Alta desde el módulo de Propuestas
Más detallesManual de usuario para Android de la aplicación PORTAFIRMAS MÓVIL
Manual de usuario para Android de la aplicación PORTAFIRMAS MÓVIL Índice 1 Introducción... 5 1.1 Perfil de la aplicación... 5 1.2 Requisitos técnicos... 5 2 Manual de usuario... 7 2.1 Instalación del certificado...
Más detallesTema 6. Reutilización de código. Programación 2015-2016. Programación - Tema 6: Reutilización de código
Tema 6 Reutilización de código Programación 2015-2016 Programación - Tema 6: Reutilización de código 1 Tema 6. Reutilización de código Modularidad. Implementación de métodos. Uso de métodos. Programación
Más detallesEn cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.
Arboles-B Características Los árboles-b son árboles de búsqueda. La "B" probablemente se debe a que el algoritmo fue desarrollado por "Rudolf Bayer" y "Eduard M. McCreight", que trabajan para la empresa
Más detallesMATERIAL 2 EXCEL 2007
INTRODUCCIÓN A EXCEL 2007 MATERIAL 2 EXCEL 2007 Excel 2007 es una planilla de cálculo, un programa que permite manejar datos de diferente tipo, realizar cálculos, hacer gráficos y tablas; una herramienta
Más detallesGUÍA RÁPIDA DE TRABAJOS CON ARCHIVOS.
GUÍA RÁPIDA DE TRABAJOS CON ARCHIVOS. 1 Direcciones o Ubicaciones, Carpetas y Archivos Botones de navegación. El botón Atrás permite volver a carpetas que hemos examinado anteriormente. El botón Arriba
Más detallesOrganización Básica de un Computador y Lenguaje de Máquina
Organización Básica de un Computador y Prof. Rodrigo Araya E. raraya@inf.utfsm.cl Universidad Técnica Federico Santa María Departamento de Informática Valparaíso, 1 er Semestre 2006 Organización Básica
Más detallesPráctica 0. Emulador XENON de la computadora CESIUS
Práctica 0. Emulador XENON de la computadora CESIUS 1. Introducción El objeto de la presente práctica es permitir al alumno ensayar y familiarizarse con los conceptos de programación de computadoras digitales
Más detallesPara crear formularios se utiliza la barra de herramientas Formulario, que se activa a través del comando Ver barra de herramientas.
Formularios TEMA: FORMULARIOS. 1. INTRODUCCIÓN. 2. CREACIÓN DE FORMULARIOS. 3. INTRODUCIR DATOS EN UN FORMULARIO. 4. MODIFICAR UN FORMULARIO 5. MANERAS DE GUARDAR UN FORMULARIO. 6. IMPRIMIR FORMULARIOS.
Más detallesEste programa mueve cada motor de forma independiente, y cuando termina una línea pasa a la siguiente.
1 Programa 1 Utilizando el icono añadimos un movimiento a por cada línea de programa. Podremos usar 8 posibles líneas de programa (Base, Hombro, Codo, Muñeca, Pinza, Salida 1, Salida 2 y línea en blanco).
Más detallesPipelining o Segmentación de Instrucciones
Pipelining o Segmentación de Instrucciones La segmentación de instrucciones es similar al uso de una cadena de montaje en una fábrica de manufacturación. En las cadenas de montaje, el producto pasa a través
Más detallesAPUNTES DE WINDOWS. Windows y sus Elementos INSTITUTO DE CAPACITACIÓN PROFESIONAL. Elementos de Windows
1 APUNTES DE WINDOWS Unidad 1: Windows y sus Elementos Elementos de Windows Escritorio: Es la pantalla que aparece cuando se inicia una sesión con Windows, desde aquí es de donde se administra el computador.
Más detallesLABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL
OBJETIVO Mejorar el nivel de comprensión y el manejo de las destrezas del estudiante para utilizar formulas en Microsoft Excel 2010. 1) DEFINICIÓN Una fórmula de Excel es un código especial que introducimos
Más detallesFundamentos de la Programación
Fundamentos de la Programación El Software Las operaciones que debe realizar el hardware son especificadas con una lista de instrucciones, llamadas programas o software. Dos grandes grupos de software
Más detallesFundamentos de Investigación de Operaciones Investigación de Operaciones 1
Fundamentos de Investigación de Operaciones Investigación de Operaciones 1 1 de agosto de 2003 1. Introducción Cualquier modelo de una situación es una simplificación de la situación real. Por lo tanto,
Más detallesMatemática de redes Representación binaria de datos Bits y bytes
Matemática de redes Representación binaria de datos Los computadores manipulan y almacenan los datos usando interruptores electrónicos que están ENCENDIDOS o APAGADOS. Los computadores sólo pueden entender
Más detallesLos elementos que usualmente componen la identidad digital son:
Enero 2016 Programa Civismo Digital - Escolar Material Educativo Lección: TU IDENTIDAD EN INTERNET v. 1.0 Topico: Alfabetización Digital, Huella Digital Objetivo: Fomentar en los alumnos la importancia
Más detallesPráctica 3: Programación con subrutinas
Práctica 3: Programación con subrutinas 3.1 Objetivos El objetivo de esta práctica es estudiar el soporte del ensamblador del ARM para la gestión de subrutinas, para lo que resulta necesario familiarizarse
Más detalles1 La Resolución de Problemas utilizando la Computadora
La Resolución de Problemas utilizando la Computadora Lissette Alvarez Abril-Julio, 2004 El Computador es una máquina que no puede trabajar por si sola, únicamente realiza aquellas órdenes que el hombre
Más detallesPara ingresar a la aplicación Microsoft PowerPoint 97, los pasos que se deben seguir pueden ser los siguientes:
Descripción del ambiente de trabajo Entrar y salir de la aplicación Para ingresar a la aplicación Microsoft PowerPoint 97, los pasos que se deben seguir pueden ser los siguientes: A través del botón :
Más detallesTutorial de UML. Introducción: Objetivos: Audiencia: Contenidos:
Tutorial de UML Introducción: El Lenguaje de Modelamiento Unificado (UML - Unified Modeling Language) es un lenguaje gráfico para visualizar, especificar y documentar cada una de las partes que comprende
Más detallesPreliminares. Tipos de variables y Expresiones
Preliminares. Tipos de variables y Expresiones Felipe Osorio Instituto de Estadística Pontificia Universidad Católica de Valparaíso Marzo 5, 2015 1 / 20 Preliminares Computadoras desarrollan tareas a un
Más detallesPRACTICA #1. Aprender a programar una interrupción software empleando C y/o Ensamblador.
PRACTICA #1 Aprender a programar una interrupción software empleando C y/o Ensamblador. Aprender a manipular dispositivos externos (8253, 8255) desde C y/o ensamblador. PROCEDIMIENTO: Vamos a programar
Más detallesUnidad III El lenguaje de programación C 1. 2. 3. 4. 5. 6. 7. 8.
Unidad III 1. Introducción. 2. Breve historia del C. 3. Lenguajes de programación de alto nivel, bajo nivel y nivel medio. 4. Compiladores e intérpretes. 5. Compilación, enlace y generación de un programa
Más detallesTema 5 Repertorios de instrucciones: Modos de direccionamiento y formato
Tema 5 Repertorios de instrucciones: Modos de direccionamiento y formato Bibliografía: William Stallings Organización y Arquitectura de computadores 5ta. Edition. Editorial Pearson Educación.- Objetivos:
Más detallesSOLUCION EXAMEN junio 2006
SOLUCION EXAMEN junio 2006 1. Explique razonadamente si las siguientes afirmaciones son verdaderas o falsas: I) (1 p) En UNIX únicamente se distinguen dos tipos de procesos: los procesos de usuario y los
Más detallesIntroducción. Ciclo de vida de los Sistemas de Información. Diseño Conceptual
Introducción Algunas de las personas que trabajan con SGBD relacionales parecen preguntarse porqué deberían preocuparse del diseño de las bases de datos que utilizan. Después de todo, la mayoría de los
Más detallesLa memoria principal. Los subsistemas de E/S. Los buses del sistema
GUIA 23: MEMORIA E/S La estructura básica de la mayoría de los ordenadores actuales se representa mediante los siguientes elementos básicos: La Unidad Central de Procesamiento, CPU La memoria principal
Más detallesTEMA 5. CONTROL DE FLUJO DEL PROGRAMA. Sentencia Instrucción Expresión Operadores + Operandos Sintaxis: Sentencia ;
TEMA 5. CONTROL DE FLUJO DEL PROGRAMA 5.1 Sentencias Una sentencia es una expresión seguida de un punto y coma. Sentencia Instrucción Expresión Operadores + Operandos Sintaxis: Sentencia ; El ; es obligatorio
Más detallesOrganización de Computadoras
Organización de Computadoras Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Segundo Cuatrimestre de 2015 Proyecto N 1 Programación en Lenguaje C El objetivo principal
Más detallesDocumentación del simulador SPIM.
Universidad de León Departamento de Ingeniería Eléctrica y de Sistemas y Automática (C) Prof. José M. Foces, 1998-2006. diejfm@unileon.es Documentación del simulador SPIM. Versión para Windows. Adaptada
Más detallesPROGRAMACIÓN ORIENTADA A OBJETOS
PROGRAMACIÓN ORIENTADA A OBJETOS Clase 1. Introducción Profesor: Diego Sánchez Gómez Introducción a la programación orientada a objetos 1. Introducción a la programación orientada a objetos 2. Las clases
Más detallesArquitectura de Computadores
Arquitectura de Computadores Ricardo.Sanz@upm.es Curso 2004-2005 Arquitectura de Computadores Arquitectura de computadores es la disciplina que estudia la organización y funcionamiento de los computadores
Más detallesLEER Y ESCRIBIR ARCHIVOS O FICHEROS EN C. FOPEN, FCLOSE, MODOS DE ACCESO READ, WRITE Y APPEND (CU00536F)
APRENDERAPROGRAMAR.COM LEER Y ESCRIBIR ARCHIVOS O FICHEROS EN C. FOPEN, FCLOSE, MODOS DE ACCESO READ, WRITE Y APPEND (CU00536F) Sección: Cursos Categoría: Curso básico de programación en lenguaje C desde
Más detallesINVENTARIO INTRODUCCIÓN RESUMEN DE PASOS
INVENTARIO INTRODUCCIÓN Es habitual que en las empresas realicen a final de año un Inventario. Con este proceso se pretende controlar el nivel de stock existente, para iniciar el nuevo ejercicio, conociendo
Más detallesMódulo II - PowerPoint
Módulo II - PowerPoint Índice Copiando diapositivas Menú Edición... 2 Copiando diapositivas utilizando la barra de herramientas... 3 Copiando diapositivas utilizando el menú contextual... 3 Copiando diapositivas
Más detallesMemoria La memoria es la parte del ordenador en la que se guardan o almacenan los programas (las instrucciones y los datos).
Memoria La memoria es la parte del ordenador en la que se guardan o almacenan los programas (las instrucciones y los datos). Memoria Típica. Los datos almacenados en memoria tienen que pasar, en un momento
Más detallesTecnólogo Informático- Estructuras de Datos y Algoritmos- 2009
Árboles Ejemplos de estructuras arborescentes: con forma de árbol Regla de Alcance: los objetos visibles en un procedimiento son aquellos declarados en él mismo o en cualquier ancestro de él (cualquier
Más detallesSea el siguiente programa de nombre "c0p1" para copiar archivos (por simplicidad se ha eliminado todo control de errores): Se pide:
Sea el siguiente programa de nombre "c0p1" para copiar archivos (por simplicidad se ha eliminado todo control de errores): 1 /* c0p1 origen destino 2 * Copia "origen" sobre "destino" byte a byte, 3 * haciendo
Más detallesEs un software de simulación que ejecuta programas en lenguaje de ensamblador para procesadores con arquitectura MIPS32.
Arquitectura de Computadoras Jose Luis Tecpanecatl Xihuitl, Ph.D. Es un software de simulación que ejecuta programas en lenguaje de ensamblador para procesadores con arquitectura MIPS32. SPIM lee e inmediatamente
Más detallesCapítulo 1 Introducción a la Computación
Capítulo 1 Introducción a la Computación 1 MEMORIA PRINCIPAL (RAM) DISPOSITIVOS DE ENTRADA (Teclado, Ratón, etc) C P U DISPOSITIVOS DE SALIDA (Monitor, Impresora, etc.) ALMACENAMIENTO (Memoria Secundaria:
Más detallesGuía Corta: Alcance y Asociaciones. 1. Preliminares: Nombres y Asociaciones
Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información CI3641 Lenguajes de Programación I Guía Corta: Alcance y Asociaciones Esta guía presenta algunos conceptos básicos y
Más detallesCapítulo 4 Procesos con estructuras de repetición
Estructura de contador Capítulo 4 Procesos con estructuras de repetición Esta es una operación que incrementa en una unidad el valor almacenado en la variable c, cada vez que el flujo del diagrama pasa
Más detallesEjercicios. 5.2 [5] < 5.3> Este ejercicio es similar al 5.1, pero ahora considere los fallos causados por permanecer en 1 (la señal es siempre 1).
Ejercicios 5.1 [5] < 5.3> Describa el efecto que un simple fallo permanecer como 0 (es decir, independiente de lo que debería ser, la señal es siempre 0) provocaría en los multiplexores en el camino de
Más detallesUnidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal)
Unidad I Sistemas numéricos 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal) Los computadores manipulan y almacenan los datos usando interruptores electrónicos que están ENCENDIDOS o APAGADOS.
Más detallesUn puntero no es más que una variable estática cuyo contenido es una dirección de memoria.
Los punteros en C 1 Introducción Cómo se organiza la memoria asociada a un programa? Como una colección de posiciones de memoria consecutivas. En ellas se almacenan los distintos tipos de datos, que ocupan,
Más detalles3.2 Operaciones aritmético-lógicas en Pascal
3.2 Operaciones aritmético-lógicas en Pascal Operadores Los operadores sirven para combinar los términos de las expresiones. En Pascal, se manejan tres grupos de operadores : 1. ARITMÉTICOS 2. RELACIONALES
Más detallesINSTITUTO TECNOLOGICO de la laguna Programación Orientada a Objetos en C++
5.- Herencia Múltiple. Un hecho natural es que una persona tenga más de un pariente mayor, esta situación también se puede dar en la herencia de clases, naturalmente este tipo de herencia involucra un
Más detalles8. Sentencia return y métodos
92 A. García-Beltrán y J.M. Arranz 8. Sentencia return y métodos Objetivos: a) Describir el funcionamiento de la sentencia return b) Interpretar el resultado de una sentencia return en el código fuente
Más detallesGeneración de código para funciones. Generación de código para funciones. Generación de código para funciones. Generación de código para funciones
Ejemplo introductorio: escritura de funciones en NASM Ejemplo introductorio: escritura de funciones en NASM En estas transparencias pondremos una subrutina ASPLE y la generación de código equivalente En
Más detallesUSO DEL COMANDO. Fdisk. Autor :. Alejandro Curquejo. Recopilación :. Agustí Guiu i Ribera. Versión :.. 1.0
USO DEL COMANDO Fdisk Autor :. Alejandro Curquejo Recopilación :. Agustí Guiu i Ribera Versión :.. 1.0 Fecha : 30 de Junio del 2001 USO DE FDISK El programa FDISK suministra información sobre las particiones,
Más detallesMicrosoft Office XP Excel XP (I)
PRÁCTICA 1 HOJA DE CÁLCULO Microsoft Office XP Excel XP (I) 1. Entrar en Windows 98 (ver práctica 1), y en el Excel abriendo el icono Microsoft Office del escritorio y seleccionar el icono Microsoft Excel,
Más detallesManual para Empresas Prácticas Curriculares
Manual para Empresas Prácticas Curriculares ÍNDICE 1. Introducción... 3. Registro y Acceso... 3.1. Registro Guiado... 4.1. Registro Guiado Datos Básicos... 5.1. Registro Guiado Contactos... 5 3. Creación
Más detalles6.1. Conoce la papelera
Unidad 6. La papelera de Reciclaje 6.1. Conoce la papelera La papelera no es más que un espacio en el disco duro reservado para almacenar la información que eliminamos, evitando que esta información aparezca,
Más detallesSISTEMA DE BECAS AL EXTERIOR
SISTEMA DE BECAS AL EXTERIOR Manual del Becado En este manual se describen los diferentes procesos que ejecuta el becado en el desarrollo de sus estudios en el exterior. Todos los procesos serán ejecutados
Más detallesPontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación
Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación Competencias IIC1103 Introducción a la Programación (I/2010) Interrogación 1 13 de Abril de 2010
Más detallesComente: Los bancos siempre deberían dar crédito a los proyectos rentables. Falso, hay que evaluar la capacidad de pago.
Explique Brevemente en que consiste el leasing y nombre los diferentes tipos existentes. Es un mecanismo de financiamiento de Activos el cual permite el uso del activo por un periodo determinado a cambio
Más detallesEjercicio 1. Desarrollar un pequeño juego para practicar mecanografía.
Examen Curso 2001-2002. Convocatoria de Febrero Página 1 Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía. Este ejercicio se divide en dos partes con el fin de que el alumno no intente
Más detallesArreglos. // Incluir E/S y Librerías Standard #include <stdlib.h> #include <stdio.h>
Arreglos Introducción. En los temas anteriores se han estudiado los diferentes tipos de datos simples de C++, usados para representar valores simples como enteros, reales o caracteres. Sin embargo, en
Más detallesInstructivo de Microsoft Excel 2003
Instructivo de Microsoft Excel 2003 El presente instructivo corresponde a una guía básica para el manejo del programa y la adquisición de conceptos en relación a este utilitario. Que es Microsoft Excel?
Más detallesCAPÍTULO I. Sistemas de Control Distribuido (SCD).
1.1 Sistemas de Control. Un sistema es un ente cuya función es la de recibir acciones externas llamadas variables de entrada que a su vez provocan una o varias reacciones como respuesta llamadas variables
Más detallesA continuación, se detalla el uso de los accesorios más comunes:
4 Los Accesorios de Windows I El sistema operativo Windows incorpora una serie de programas de utilidad general, de forma que pueda trabajar con su ordenador sin tener que recurrir a programas comerciales.
Más detalles7. Manejo de Archivos en C.
7. Manejo de Archivos en C. Los datos que hemos tratado hasta el momento han residido en la memoria principal. Sin embargo, las grandes cantidades de datos se almacenan normalmente en un dispositivo de
Más detallesUNIDADES DE ALMACENAMIENTO DE DATOS
1.2 MATÉMATICAS DE REDES 1.2.1 REPRESENTACIÓN BINARIA DE DATOS Los computadores manipulan y almacenan los datos usando interruptores electrónicos que están ENCENDIDOS o APAGADOS. Los computadores sólo
Más detallesIngeniería de Software I
Ingeniería de Software I Diagramas de Actividad 2 Cuatrimestre 1998 1. INTRODUCCIÓN 1 2. DIAGRAMA DE ACTIVIDAD 1 2.1. SEMÁNTICA 1 2.2. NOTACIÓN 1 2.3. EJEMPLO 2 3. ACCIÓN 3 3.1. SEMÁNTICA 3 3.2. NOTACIÓN
Más detallesGuía para la migración de asignaturas de grado y másteres al nuevo espacio docente para el curso 2015/2016
Guía para la migración de asignaturas de grado y másteres al nuevo espacio docente para el curso 2015/2016 El presente manual ha sido elaborado antes de la puesta en producción de la plataforma para el
Más detallesSoporte lógico de computadoras
Soporte lógico de computadoras Software: Sistemas Operativos Lenguajes de programación Lenguajes de Programación. Clasificación Proximidad del lenguaje al que entiende el ordenador: Bajo nivel: específico
Más detallesTema 2. Diseño del repertorio de instrucciones
Soluciones a los problemas impares Tema 2. Diseño del repertorio de instrucciones Arquitectura de Computadores Curso 2009-2010 Tema 2: Hoja: 2 / 16 Tema 2: Hoja: 3 / 16 Base teórica Al diseñar un computador,
Más detallesPrograma Presupuestos de Sevillana de Informática.
Programa Presupuestos de Sevillana de Informática. Introducción. En sus inicios, el programa Presupuestos estaba pensado únicamente para escribir e imprimir presupuestos, facilitando el trabajo con un
Más detallesGUÍA PARA MANEJAR GOOGLE DRIVE
GUÍA PARA MANEJAR GOOGLE DRIVE 1 Universidad de Córdoba Grupo de Investigación AVI Ambientes Virtuales Interactivos GOOGLE DRIVE GOOGLE DOCS O GOOGLE DRIVE Google Docs es una sencilla pero potente suite
Más detallesSISTEMA ETAP en línea Estándares Tecnológicos para la Administración Pública
JEFATURA DE GABINETE DE MINISTROS SISTEMA ETAP en línea Estándares Tecnológicos para la Administración Pública Manual para los Organismos Índice Índice... 2 Descripción... 3 Cómo solicitar la intervención
Más detallesLa ventana de Microsoft Excel
Actividad N 1 Conceptos básicos de Planilla de Cálculo La ventana del Microsoft Excel y sus partes. Movimiento del cursor. Tipos de datos. Metodología de trabajo con planillas. La ventana de Microsoft
Más detallesTEMA 3. EL PROCESO DE COMPILACIÓN, DEL CÓDIGO FUENTE AL CÓDIGO MÁQUINA
TEMA 3. EL PROCESO DE COMPILACIÓN, DEL CÓDIGO FUENTE AL CÓDIGO MÁQUINA Programa: Algoritmo (secuencia no ambigua, finita y ordenada de instrucciones para la resolución de un determinado problema) traducido
Más detallesGuía para El Proveedor **********
Este es un sistema completamente nuevo, que esta implementado la OPS. Aún hay mejoras que realizar, en las secciones que tienen que estar en español. Esperamos poder tener todo actualizado muy pronto.
Más detallesMANEJANDO FICHEROS Y CARPETAS
Tutorial 1 MANEJANDO FICHEROS Y CARPETAS 1.1.- Creando carpetas Para organizar la información que almacenamos en nuestros ordenadores, tenemos una elemento denominado carpeta. Vamos a ver cómo, usando
Más detallesCASO PRÁCTICO DISTRIBUCIÓN DE COSTES
CASO PRÁCTICO DISTRIBUCIÓN DE COSTES Nuestra empresa tiene centros de distribución en tres ciudades europeas: Zaragoza, Milán y Burdeos. Hemos solicitado a los responsables de cada uno de los centros que
Más detallesTema 8 Procesos. * Definición informal: un proceso es un programa en ejecución
Tema 8 Procesos 8.1 Aspectos básicos de los procesos 8.1.1 Concepto de proceso * Definición informal: un proceso es un programa en ejecución Un programa ejecutable es un conjunto de instrucciones y datos
Más detallesMACROS Y FORMULARIOS
MACROS Y FORMULARIOS Para poder realizar formularios en Excel es necesario ubicar el menú programador Qué hacer si no aparece el menú programador? En algunos equipos no aparece este menú, por lo que es
Más detallesUTILIDAD DE EXPORTACIÓN DE ASIENTOS A CONTAPLUS
MESP V3.0 UTILIDAD DE EXPORTACIÓN DE ASIENTOS A CONTAPLUS AM Consultores Ps Castellana, 226 28046 Madrid mesp@allegmusic.com Utilidad de exportación de asientos a Contaplus 2 3 Utilidad de exportación
Más detallesOperación de Microsoft Word
Trabajar con tablas Las tablas permiten organizar la información y crear atractivos diseños de página con columnas paralelas de texto y gráficos. Las tablas pueden utilizarse para alinear números en columnas
Más detallesHP Backup and Recovery Manager
HP Backup and Recovery Manager Manual de usuario Version 1.0 Índice Introducción Instalación Cómo se instala Opciones de idioma HP Backup and Recovery Manager Recordatorios Copias de sguridad programadas
Más detallesCapítulo 4 Gestión de memoria
Sistemas operativos: una visión aplicada Capítulo 4 Gestión de memoria Contenido Objetivos del sistema de gestión de memoria Modelo de memoria de un proceso Esquemas de memoria basados en asignación contigua
Más detallesHERRAMIENTAS DE ACCESS ACCESS 2010. Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE
HERRAMIENTAS DE ACCESS ACCESS 2010 Manual de Referencia para usuarios Salomón Ccance CCANCE WEBSITE HERRAMIENTAS DE ACCESS En esta unidad veremos algunas de las herramientas incorporadas de Access que
Más detallesISTP CIDET COMPUTACION E INFORMATICA ARREGLOS EN JAVA
ARREGLOS EN JAVA I I N T R O D U C C I Ó N En las sesiones anteriores, los datos manejados en los programas han sido datos simples (carácter, entero, reales) En un gran número de problemas es necesario
Más detallesPara ingresar a la aplicación Microsoft Word 97, los pasos que se deben seguir pueden ser los siguientes:
Acceso a la aplicación Descripción del ambiente de trabajo Para ingresar a la aplicación Microsoft Word 97, los pasos que se deben seguir pueden ser los siguientes: A través del botón Inicio: 1. Seleccionar
Más detallesSesión 3 - Movimiento Diferencial
Sesión 3 - Movimiento Diferencial Qué aprenderemos en esta sesión? Para entender como nuestro robot se va a desplazar por cualquier superficie, debemos aprender la manera en que lo hace, por eso, en esta
Más detallesCÓMO CREAR NUESTRO CATÁLOGO
CÓMO CREAR NUESTRO CATÁLOGO Mediante la aplicación (http://www.prensasoft.com/programas/conline) podemos crear nuestros propios catálogos. Para crear un catálogo necesitamos: - Varios productos que mostrar,
Más detallesProgramación Orientada a Objetos con Java
Programación Orientada a Objetos con Java M.C. Jorge Eduardo Ibarra Esquer jorgeeie@uabc.mx Sobrecarga de métodos Java permite la definición de dos o más métodos que tengan el mismo nombre, dentro de la
Más detalles