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 - FERNIIIIN

#1
ASM / Re: crear interrupción por hardware
17 Junio 2019, 05:07 AM
lamento la respuesta tardía, lo realice y me funciono.
:-[ :-[

Gracias, por tu apoyo.
#2
ASM / crear interrupción por hardware
28 Mayo 2019, 06:23 AM
Hola a todos, tengo una super pregunta, ¿Como se crea una interrupción por hardware?

Tengo un programa que hace un conteo del 0 al 59 y cuando llega a 60 pasa denuevo al 0 y reinicia el ciclo, hasta ahi voy bien, pero no se como hacer que al presionar la tecla "1" se active un retraso y que al presionar "2" se active otro retraso diferente.


En código tengo lo siguiente:
Código (asm) [Seleccionar]

org 100h

.model small

.stack 100

.data
u db 0
d db 0
v db 0
tiempo db 0

.code

start:
mov cx,00h ; inicializo contador en cero

inicio:
mov tiempo,cl
;call retraso1s  ;salto a retraso de 1s
;call retraso5s  ;salto a retraso de 1s
;call retraso10s ; salto a retraso de 10s
mov cl,tiempo
cmp cl,10 ; compara si en el contador es mayor a 9
jc aumento ;Destino es menor que origen
;jne repite ; sino es verdadera la ultima comparacion regresa a repite
jz separar ;Numeros iguales
jnz separar ;Destino mayor a origen
cmp d,06h
jc inicio ;Destino es menor que origen
jz start ;Numeros iguales

       
separar:
mov al,cl
AAM
mov u,al
mov al,ah
AAM
mov d,al
;cmp d,06h
;jz salir ;Numeros iguales
mov ah,02h
mov dl,d
add dl,30h
int 21h   
mov ah,02h
mov dl,u
add dl,30h
int 21h
inc cl ; incremento el contador en uno
jmp inicio
ret

aumento:
mov dl,cl ; muevo el valor del contador a dl para imprimir
inc cl ; incremento el contador en uno
add dl,30h ; sumo 30h a dl para convertirlo al codigo ascii y poder imprimirlo
mov ah,02h ; funcion para imprimir un caracter
int 21h ; imprimo
jmp inicio
ret       
       

retraso1s:
    MOV     CX, 0FH
    MOV     DX, 4240H
    MOV     AH, 86H
    INT     15H   
ret

retraso4s:
    MOV     CX,3aH
    MOV     DX,9680H
    MOV     AH,86H
    INT     15H   
ret

retraso5s:
    MOV     CX,45H
    MOV     DX,9680H
    MOV     AH,86H
    INT     15H   
ret


retraso10s:
    MOV     CX, 98H
    MOV     DX, 9680H
    MOV     AH, 86H
    INT     15H   
ret


salir:
.exit
end



Espero que me puedan dar una idea de como continuar
#3
Cita de: cpu2 en 28 Mayo 2019, 00:25 AM
En estos momentos no puedo testear el code, por lo qie dices tienes el problema en convertir el entero 60 a 0? Tiene facil solucion, con una rutina de comparacion y un xor lo tendrias.

Un saludo.


Gracias por responder. Lo que me causa conflicto es el porque después del segundo 60 (00) no pasa al 01, en su lugar se termina el la ejecución.
#4
Hola a todos, estoy creando un contador que toma los segundos del sistema y sigue con el conteo cada segundo y manda a imprimir el mismo, pero tengo un problema en la conversión de 60 a 00 y validarlo al momento de comparar con el segundo actual.

Código (mpasm) [Seleccionar]

org 100h

.model small


.stack 100


.data
s0      db 30h
s1      db 30h
sold    db 0
snew    db 0



.code
.startup
    init:
mov ah,2ch 
int 21h     ;dh =segundos del sistema
        mov sold,dh
        call hora       
add dh, 1  ;dh= segundo se sistema +1
mov snew, dh ;snew es el segundo posterior
        cmp snew,60
jz seis0  ;Numeros iguales
        jmp sincronizados           
       

sincronizados:   
mov ah,2ch 
int 21h     ;dh =segundos del sistema
mov bl,dh
    mov bh,snew
cmp bl, bh ;compara (new segundo) contra (old segundo + 1)
jne sincronizados ;salto si no son iguales
jmp init
ret
 

seis0:
mov ah,2ch 
int 21h     ;dh =segundos del sistema
        mov sold,dh
cmp sold,00
jnz seis0 ;Destino mayor a origen
mov sold,00 ;reset sold a 0
call separa
mov snew,1
jmp sincronizados
ret


    hora:
       
        cmp sold,10
        jae separa
jmp sincronizados

    ret
   
    separa:
        mov al,sold
        AAM
        mov bx,ax
        mov ah,02h
        mov dl,bh
        add dl,30h
        int 21h
        mov ah,02h
        mov dl,bl
        add dl,30h
        int 21h
    ret



Esto es lo que tengo hecho.
El contador va bien hasta el momento en que va iniciar un nuevo ciclo de conteo (es decir, va del segundo del sistema hasta el 60 o 00) y de ahi se queda en un ciclo, nunca pasa al 01.

Espero que me puedan ayudar
#5
Buenas chicos, intento implementar una función que imprima los valores de un arreglo 2-d, pero no se que poner en el parámetro donde va la segunda dimensión, con malloc pido memoria para un int o que me recomiendan.

Aqui tengo el problema:

void muestra(int matriz[][], int renglon, int columna)


El valor de las dimensiones de mi array es variable, bien puede ser 2x 3 o 20x20.
Lo que tengo de código es:

void muestra(int matriz[][], int renglon, int columna);

int main() {
  int M, N, i, j;

scanf("%d %d", &M, &N);

  int b_minas [M][N];

  for (i= 0; i < M; i++) {
    for (j= 0; j < N; j++) {
    scanf("%d", &b_minas[i][j]);
    }
  }
  muestra( b_minas, M, N);


  return 0;
}

void muestra(int matriz[][], int renglon, int columna) {
  printf("\n");
  int i, j;

  for (i= 0; i < renglon; i++) {
    for (j= 0; j < columna; j++) {
    printf("%d ", matriz[i][j]);
    }
    printf("\n");
  }
}
#6
Lamento la demora, por cierto coloco este código super básico. Hace lo mismo pero no se compara a lo que han puesto hasta ahora.


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void mostrar_arreglo(int *A, int long_cad);
void ordenacion_seleccion (int * A, int N);
void intercambiar (int * A, int i, int j);

int main() {
int  N, M, L, i, j=0;

scanf("%d", &N);
scanf("%d", &M);
L= N+M;
int arreglo_n[N], arreglo_m[M], arreglo_final[L];
for ( i= 0; i < N; i++) {
scanf("%d", &arreglo_n[i]);
}
for ( i= 0; i < M; i++) {
scanf("%d", &arreglo_m[i]);
}
for ( i = 0; i < L; i++) {
if (i< N) {
arreglo_final[i]= arreglo_n[i];
} else {
arreglo_final[i]= arreglo_m[j];
j++;
}
}
ordenacion_seleccion( arreglo_final, L);
mostrar_arreglo( arreglo_final, L);
}

void ordenacion_seleccion (int * A, int N)
{//ordena un conjunto por seleccion
    int i, j, k;
    for (i = 0; i < N - 1; i++)
    {
        for (k = i, j = i + 1; j < N; j++)
            if (A[j] < A[k])
                k = j;
        if (k != i)
            intercambiar (A, i, k);
    }
}

void intercambiar (int * A, int i, int j)
{//intercambiar lugares para completar la funcion ordenacion_seleccion
    int tmp = A[i];
    A[i] = A[j];
    A[j] = tmp;
}

void mostrar_arreglo(int *A, int long_cad)
{
  int i= 0;
  for ( i= 0; i < long_cad; i++) {
    printf("%d ", A[i]);
  }
}
#7
Basándome en parte de lo que creaste "AlbertoBSD" yo estoy haciendo otro, para ver si soy capaz de simplificarlo. En la noche lo subo.

SALUDOS. ;D
#8
Cita de: AlbertoBSD en  7 Noviembre 2018, 01:59 AM
Salida:


C:\codigos>tsss.exe
10
1 2 3 5 5 5 5 5 5 5
Numero 1: 1
Numero 2: 2
Numero 3: 3
Numero 4: 5
Numero 5: 5
Numero 6: 5
Numero 7: 5
Numero 8: 5
Numero 9: 5
Numero 10: 5



Codigo


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main() {
int  N,i = 0,len;
char **arreglo = NULL;
char *buffer;
char *token = NULL;
char temporal[1000];
fgets(temporal,1000,stdin);
N = strtol(temporal,NULL,10);
token = strtok(buffer," ");
fgets(temporal,1000,stdin);
token = strtok(temporal," ");
do {
arreglo = realloc(arreglo, sizeof(char*) * (i +1));

//arreglo[i] = token; // Esta linea esta bien, pero realmente recomiendo moverl el contenido de esta posicion de memoria a uno que si controlemos nosotros
len = strlen(token);
arreglo[i] = calloc(len+1,sizeof(char));
memcpy(arreglo[i],token,len);
printf("Numero %i: %s\n",i+1,arreglo[i]);
token = strtok(NULL," ");
i++;
}while(i < N && token != NULL);
}


Saludos!

Muchas gracias, ayer tenia prisa y confundí el código con un ejercicio similar pero con mas entradas.
Un amigo me estaba ayudando y me mando parte del código, tal vez y si lo copio, pero como tenia prisa no pudo explicarme bien que había hecho.

Una ultima pregunta, ¿sabes si hay una función para pasar el valor que esta guardando el doble puntero (arreglo) a un array?

Es decir, algo así como:
**arreglo= arr[j]
#9
Cita de: MAFUS en  6 Noviembre 2018, 20:05 PM
Intenta con strtok

Tengo esto escrito pero no me deja avanzar en el GETS

int main() {
int  total = 0, N, M;
char **arreglo = NULL;
char *buffer; // donde se guarda todo el texto
char *token = NULL;

  scanf("%d %d", &N, &M);
  gets (*buffer);
  printf("%s\n", *buffer);

token = strtok(*buffer,",");
while(token != NULL) {
arreglo = realloc(arreglo, sizeof(char*) * (total +1));
arreglo[total] = token;
printf("Nombre %i: %s\n",total+1,arreglo[total]);
total++;
token=strtok(NULL,",");
}
}


Alguien me podría decir ¿en que me estoy equivocando?
#10
Buenas dias/tardes/noches a todos tengo un problema en el que espero que me puedan ayudar.

Necesito guardar un serie de números enteros que están separados por un espacio en un arreglo, es decir, me dan un número N que la longitud de mi arreglo A[N] y la siguiente entrada son N números que debo guardar en A, ejemplo:

5
1 3000 466 588 57778


Mi duda es como guardarlos, si estuvieran juntos los números o los ingresaran un seguido de otro seria fácil, pero de esta forma no se me ocurre que hacer.

Gracias a todo los que puedan darme unas ideas que implementar.