Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - eltongabinghiman

#11
Programación C/C++ / C para interrupciones
21 Diciembre 2011, 01:38 AM
Se utilizan en la práctica códigos en C para implementar interrupciones al procesador?

Simplemente por curiosidad, porque en la materia Arquitectura de Computadores nos piden escribir códigos de interrupciones en C, y después compilarlas a Ensamblador ( :¬¬ ).

Será que hoy en día hay alguna persona en el planeta que se dedique a programar en lenguaje ensamblador (quitando casos académicos)? Tal vez es un poco ignorante de mi parte preguntarlo, pero hay que tener mucho huevo para pasar 8 horas metiendo ensamblador, yo estoy deseando que termine el semestre jaja.

Saludos.

#12
Muchas gracias  ;D
#13
Te agradezco la ayuda!

Me queda una duda con respecto a lo que se guarda en el stack cuando se llama a la recursión.

Con respecto a lo siguiente:

Cita de: adastra en 19 Diciembre 2011, 09:49 AM
por otro lado, en la stack se almacenan los parámetros del procedimiento y las variables locales que se inidican en el mismo, por ejemplo, los valores de los registers ax, cx y bx.

Cuando decís que se guardan los registros ax, cx y bx, te referís a que se guardan automáticamente al hacer la llamada recursiva? Porque he visto ejemplos que eso se hace a mano (push) y no se me ocurre por qué debería hacerse en todos los casos.

Lo que sí pienso que se está guardando en el stack es el valor del registro IP, porque ret lo que hace es un salto al valor apuntado al tope de la pila, y pienso que ese tope, para que todo ande bien, debería ser el valor de IP al momento de llamar a la recursión. ¿Es correcto esto?

Ahora me surgió una duda con respecto al direccionamiento de memoria.
Siempre las palabras en memoria son del largo de los registros? O sea, para un procesador de 16 bits, los registros serán de largo 16 bits y la memoria estará dividida en bloques de 16 bits siempre?

#14
ASM / [Ensamblador 8086] Recursión y uso del stack
19 Diciembre 2011, 07:25 AM
Buenas gente.

Tengo bastantes dudas sobre el uso del stack en procedimientos recursivos, y sobre el diseño mismo de dichos procedimientos.

Me gustaría que alguien pueda aclararme la situación explicándome un poco o mediante alguna bibliografía que hable sobre eso específicamente, porque he googleado pero no encuentro mucha info.

Voy a citar un ejemplo de mi material de estudio para que quede claro, es el procedimiento recursivo asociado a el cálculo de la función factorial.


fact proc
   cmp ax,0  ; comparo n con cero
   je esCero
   dec ax    ; ajusto par·metro para la invocaciÛn
   call fact ; realizo la llamada recursiva
   inc ax
   mov cx,ax ; guardo ax pues mul lo modifica
   mul bx    ; calculo el paso recursivo
   mov bx,ax ; asigno el resultado del paso 
     ; recursivo
   mov ax,cx ; restauro ax
   jmp fin
esCero:
   mov bx,1  ; asigno el resultado del paso base
fin:
ret
fact endp



Algunas dudas:
   

  • Cuando se llama recursivamente al procedimiento, no es igual que un salto con jmp no? Qué se hace al llamar a un procedimiento?

  • Cuál es la función del stack al llamar a la recursión? Qué es lo que se almacena en el stack? (supongo que es la dirección de la instrucción siguiente a la línea que contiene la llamada recursiva, y que cuando se hace "ret" se estaría regresando a dicho lugar, pero no estoy seguro)
    Esto se procesa automáticamente mediante la Unidad de Control?


Les agradezco cualquier ayuda que puedan brindarme .

Saludos.




#15
La idea del Selection Sort es ordenar un arreglo, manteniendo el arreglo ordenado del lado izquierdo, y el desordenado del lado derecho (o como más te guste).

A medida que el algoritmo avanza, el tamaño de la parte ordenada va creciendo, y el de la parte desordenada decreciendo.

Un seudocódigo podría ser el siguiente:


SelectionSort( array desordenado, largo de array ) -> array ordenado
   desde i=0 a (largo-2)
        pos_men = menor(array, i) // posicion del elemento con menor valor desde i
        intercambiar(pos_men,i)
   fin-desde


Como verás se busca el elemento más chico (se guarda su posición en pos_men) y se inserta en el primer lugar, luego entre los que quedan por ordenar se busca el más chico y se inserta en el segundo lugar, así hasta el anteúltimo elemento. El último elemento quedará automáticamente ordenado en su lugar.

Si N es el largo del array, para insertar el primer elemento se hacen N-1 comparaciones, para el segundo N-2 y así sucesivamente hasta 1.

Por lo que en total se hacen (N-1 + N-2 + N-3 +...+ 2 + 1) comparaciones, o lo que es lo mismo la sumatoria de los primero N-1 naturales, cuyo valor es:

N(N-1)/2

Espero se haya entendido.

Saludos.