elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Temas
Páginas: [1]
1  Programación / ASM / Error en programa en Ensamblador en: 28 Mayo 2022, 21:35 pm
Hola, estoy haciendo este programa en ensamblador para métodos de ordenamiento. Pero después de mostrar el menú me muestra el error de Violaciòn de segmento ('core' generado)
Me podrìan ayudar a saber en dónde está el error por favor?

Código
  1. section .data
  2.  msg1 db "Ingrese 5 números presionando [Enter] entre cada uno de ellos" , 10
  3.  len1 equ $-msg1
  4.  
  5.  msg2 db "***MÉTODOS DE ORDENAMIENTO DISPONIBLES***", 10
  6.  len2 equ $-msg2
  7.  
  8.  msg3 db "1. INSERTION SORT", 10
  9.  len3 equ $-msg3
  10.  
  11.  msg4 db "2. SELECTION SORT", 10
  12.  len4 equ $-msg4
  13.  
  14.  msg5 db "3. BUBBLE SORT", 10
  15.  len5 equ $-msg5
  16.  
  17.  msg6 db "Ingrese el número correspondiente al método de ordenamiento deseado:", 10
  18.  len6 equ $-msg6
  19.  
  20.  msg7 db 0xA
  21.  len7 equ $-msg7
  22.  
  23.  array db 0,0,0,0,0
  24.  la equ $-array
  25.  
  26. section .bss
  27.  res resb 10
  28.  
  29.  
  30. section .text
  31.  global _start
  32.  
  33.    _start:
  34.  
  35.       ;Mostrar mensaje 1
  36.       mov eax,4
  37.       mov ebx,1
  38.       mov ecx, msg1
  39.       mov edx, len1
  40.       int 0x80
  41.  
  42.       mov esi, array
  43.       mov edi, 0
  44.  
  45.       call lee
  46.  
  47.  
  48.       ;SALTO DE LÍNEA
  49.       mov eax, 4
  50.       mov ebx, 1
  51.       mov ecx, msg7
  52.       mov edx, len7
  53.       int 0x80
  54.  
  55.       jmp menu
  56.  
  57.       jmp end
  58.  
  59.  
  60.  
  61.  
  62.    ;--------------------------------------------------------------
  63.    lee:
  64. push ebp
  65. mov ebp, esp
  66.  
  67. ;Almacenamos los 5 números
  68.     num:
  69. mov eax, 3
  70. mov ebx, 0
  71. mov ecx, res
  72. mov edx, 10
  73. int 0x80
  74.  
  75. mov esi, res
  76. call atoi
  77. mov [res], eax
  78.  
  79. mov al, [res]
  80.  
  81. mov [esi], al
  82. inc edi
  83. inc esi
  84. cmp edi, la
  85. jb num
  86.  
  87. pop ebp
  88. ret
  89.  
  90.    ;----------------------------------------------------------------
  91.    menu:
  92.       ;MOSTRANDO MENÚ
  93.       ;Mostrar mensaje 2
  94.       mov eax,4
  95.       mov ebx,1
  96.       mov ecx, msg2
  97.       mov edx, len2
  98.       int 0x80
  99.  
  100.       ;SALTO DE LÍNEA
  101.       mov eax, 4
  102.       mov ebx, 1
  103.       mov ecx, msg7
  104.       mov edx, len7
  105.       int 0x80
  106.  
  107.       ;Mostrar mensaje 3
  108.       mov eax,4
  109.       mov ebx,1
  110.       mov ecx, msg3
  111.       mov edx, len3
  112.       int 0x80
  113.  
  114.       ;Mostrar mensaje 4
  115.       mov eax,4
  116.       mov ebx,1
  117.       mov ecx, msg4
  118.       mov edx, len4
  119.       int 0x80
  120.  
  121.       ;Mostrar mensaje 5
  122.       mov eax,4
  123.       mov ebx,1
  124.       mov ecx, msg5
  125.       mov edx, len5
  126.       int 0x80
  127.  
  128.       ;SALTO DE LÍNEA
  129.       mov eax, 4
  130.       mov ebx, 1
  131.       mov ecx, msg7
  132.       mov edx, len7
  133.       int 0x80
  134.  
  135.       ;Mostrar mensaje 6
  136.       mov eax,4
  137.       mov ebx,1
  138.       mov ecx, msg6
  139.       mov edx, len6
  140.       int 0x80
  141.  
  142.       ;SALTO DE LÍNEA
  143.       mov eax, 4
  144.       mov ebx, 1
  145.       mov ecx, msg7
  146.       mov edx, len7
  147.       int 0x80
  148.    ;--------------------------------------------------------------------------------------  
  149.    atoi:
  150.        push ebp
  151.        mov ebp, esp
  152.        xor eax, eax
  153.    .top:
  154.        movzx ecx, byte [esi] ; obtener un caracter
  155.        inc esi ; leer la siguiente dirección
  156.        cmp ecx, '0' ; digito valido?
  157.        jb .done
  158.        cmp ecx, '9'
  159.        ja .done
  160.        sub ecx, '0' ; "convertir" caracter a numero
  161.        imul eax, eax, 10 ; multiplicar el resultado obtenido por 10
  162.        add eax, ecx ; sumatoria
  163.        jmp .top ; until done
  164.        .done:
  165.        pop ebp
  166.        ret
  167.  
  168.    ;------------------------------------------------------------------
  169.  
  170.    end:
  171.       ;FINAL DEL PROGRAMA
  172.       mov eax, 1
  173.       xor ebx, ebx
  174.       int 0x80
2  Programación / ASM / Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos en: 6 Abril 2022, 07:19 am
Hola, espero me pueda ayudar
Tengo este código que suma 2 numeros de 2 dígitos en ensamblador NASM, pero quisiera mostrar el resultado en pantalla mediante una función CALL, el problema es que no entiendo como realizarlo ya que el resultado de la suma està en el registro eax y està en hexadecimal, tengo mi duda de si tengo que realizar una conversion a decimal de ese número o algua cosa así.

Código
  1. section .data
  2.    msg_1: db "Introduce un primer numero :", 10
  3.    lnmsg1 : equ $-msg_1
  4.    msg_2: db "Escribe un segundo numero :", 10
  5.    lnmsg2 : equ $-msg_2
  6.    msg_3: db "El resultado de la suma es:",10
  7.    lnmsg3 : equ $-msg_3
  8.  
  9.    diez db 10
  10.  
  11. section .bss
  12.    num1 resb 10
  13.    num2 resb 10
  14.    resultado resb 10
  15.    aux resb 10
  16.  
  17. section .text
  18.    global _start
  19.    _start:
  20.  
  21.        mov ecx, msg_1
  22.        mov edx, lnmsg1
  23.        mov ebx, 1
  24.        mov eax, 4
  25.        int 0x80  
  26.  
  27.        mov ecx, num1
  28.        mov edx, 10
  29.        mov ebx, 1
  30.        mov eax, 3
  31.        int 0x80  
  32.  
  33.        mov ecx, msg_2
  34.        mov edx, lnmsg2
  35.        mov ebx, 1
  36.        mov eax, 4
  37.        int 0x80  
  38.  
  39.        mov ecx, num2
  40.        mov edx, 10
  41.        mov ebx, 1
  42.        mov eax, 3
  43.        int 0x80  
  44.  
  45.        mov esi, num1
  46.        call atoi
  47.        pop eax
  48.  
  49.        mov esi, num2
  50.        call atoi
  51.        pop ebx
  52.  
  53.        add eax, ebx           ;El resultado de la suma se guarda en eax
  54.  
  55.  
  56.        call imprimir
  57.        jmp end
  58.  
  59.  
  60.  
  61.  
  62.        atoi:
  63.        push ebp
  64.        mov ebp, esp
  65.        xor eax, eax
  66.    .top:
  67.        movzx ecx, byte [esi] ; obtener un caracter
  68.        inc esi ; leer la siguiente dirección
  69.        cmp ecx, '0' ; digito valido?
  70.        jb .done
  71.        cmp ecx, '9'
  72.        ja .done
  73.        sub ecx, '0' ; "convertir" caracter a numero
  74.        imul eax, eax, 10 ; multiplicar el resultado obtenido por 10
  75.        add eax, ecx ; sumatoria
  76.        jmp .top ; until done
  77.  
  78.    .done:
  79.        pop ebp
  80.        ret
  81.  
  82.  
  83.  
  84.    imprimir:
  85.        push ebp
  86.        mov ebp, esp
  87.        mov [resultado], eax
  88.  
  89.  
  90.        mov eax, 4
  91.        mov ebx, 1
  92.        mov ecx, msg_3
  93.        mov edx, lnmsg3
  94.        int 0x80
  95.  
  96.        mov eax, 4
  97.        mov ebx, 1
  98.        mov ecx, resultado
  99.        mov edx, 10
  100.        int 0x80
  101.  
  102.        pop ebp
  103.        ret
  104.  
  105.  
  106.    end:
  107.        mov eax, 1
  108.        xor ebx, ebx
  109.        int 80h
  110.  
  111.  
  112.  
  113.        ; algoritmo de conversion
  114.        ; val = 0
  115.        ; numero = "289"
  116.        ; val = val + ('9' - 48) * 10⁰
  117.        ; val = 9 + ('8' - 48) * 10¹
  118.        ; val = 89 + ('2' - 48) * 10²
  119.        ; imul dest, op1, op2
  120.  
3  Programación / Programación C/C++ / Linked List en: 18 Noviembre 2020, 02:28 am
Hola.
No puedo generar el algoritmo para la función insertAfter, la cual inserta un elemento después de otro, según la llave tecleada.
Espero me puedan ayudar por favor.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <locale.h>
  5. // Definición de variables globales
  6. struct node {
  7.   int data;
  8.   struct node *next;
  9. };
  10. struct node *start = NULL; // start es el pointer al primer nodo
  11. struct node *found = NULL; // found es el pointer al nodo encontrado
  12. int count = 0; // Número de nodos
  13. // Definición de funciones
  14. void insertFirst(int); // Inserta un nodo al principio de la lista
  15. void insertLast(int); // Inserta un nodo al final de la lista
  16. void insertAfter(int, int); // Inserta un nodo después de otro
  17. int find(int); // Buscar un nodo
  18. void traverse(); // Realiza el recorrido de la lista
  19. void deleteFirst(); // Remueve el primer nodo de la lista
  20. void deleteLast(); // Remueve el último elemento de la lista
  21. void create(); // Función auxiliar, crea una lista
  22.  
  23. int main () {
  24.   int dato, opcion;
  25.    setlocale(LC_ALL, ""); // para caracteres del Español
  26.    printf(" 1 - Insertar al inicio de la linked list.\n");
  27.    printf(" 2 - Insertar al final de la linked list.\n");
  28.    printf(" 3 - Insertar después de otro.\n");
  29.    printf(" 4 - Buscar un nodo en la lista.\n");
  30.    printf(" 5 - Desplegar la linked list (traverse).\n");
  31.    printf(" 6 - Borrar elemento al inicio\n");
  32.    printf(" 7 - Borrar elemento al final.\n");
  33.    printf(" 8 - Terminar\n");
  34.    create(); // crea una lista de prueba
  35.    while (true) {
  36.        printf("Teclee la opción: ");
  37.        scanf("%d", &opcion);
  38.        switch (opcion) {
  39.        case 1: // insertar al inicio
  40.            printf("Teclee valor del elemento a insertar al inicio\n");
  41.         scanf("%d", &dato);
  42.         insertFirst(dato);
  43.            break;
  44.        case 2: // insertar al final
  45.            printf("Teclee valor del elemento a insertar al final\n");
  46.         scanf("%d", &dato);
  47.         insertLast(dato);
  48.            break;
  49.        case 3: // insertar después
  50.            printf("Teclee valor de la llave.\n");
  51.         scanf("%d", &dato);
  52.         int llave = find(dato);
  53.         if (llave == -2) { // find regresa -2 si la lista está vacía
  54.         break;
  55. }
  56.         if(llave == -1) { // find regresa -1 si no se encuentra
  57.         printf("No se encontró %d en la lista.\n", dato);
  58.         break;
  59. }
  60.         printf("Teclee valor de nodo a insertar después de llave.\n");
  61.         scanf("%d", &dato);
  62.         int nuevo = find(dato);
  63. insertAfter(llave, dato);
  64.            break;
  65.        case 4: // buscar
  66.            printf("Teclee valor del elemento a buscar.\n");
  67.         scanf("%d", &dato);
  68.         int encontrado = find(dato);
  69.         if (encontrado == -2) { // find regresa -2 si la lista está vacía
  70.         break;
  71. }
  72.         if(encontrado == -1) { // find regresa -1 si no se encuentra
  73.         printf("No se encontró %d en la lista.\n", dato);
  74. } else {
  75. printf("Se encontró %d en la lista.\n", dato);
  76. }
  77.            break;
  78.        case 5: // recorrer
  79.         traverse();
  80.            break;
  81.        case 6: // borrar el primero
  82.            deleteFirst();
  83.            break;
  84.        case 7: // borrar el último
  85.            deleteLast();
  86.            break;
  87.        case 8:
  88.            printf("Gracias por participar");
  89.            exit(0);
  90.        default:
  91.            printf("Opción inválida, intente de nuevo\n");
  92.   }
  93.    }
  94.   return 0;
  95. }
  96.  
  97. void insertFirst(int dato) {
  98.   struct node *t;
  99.   t = malloc(sizeof(struct node));  // ubica memoria para el nodo
  100.   count++;
  101.   if (start == NULL) { // primera vez
  102.      start = t;
  103.      start->data = dato;
  104.      start->next = NULL;
  105.      return;
  106.   }
  107.   t->data = dato;
  108.   t->next = start;
  109.   start = t;
  110. }
  111.  
  112. void insertLast(int dato) {
  113.   struct node *t, *temp;
  114.   t = malloc(sizeof(struct node));
  115.   count++;
  116.   if (start == NULL) { // Primera vez
  117.      start = t;
  118.      start->data = dato;
  119.      start->next = NULL;
  120.      return;
  121.   }
  122.   temp = start;
  123.   while (temp->next != NULL) {   // busca el último nodo
  124.      temp = temp->next;
  125.   }
  126.   temp->next = t;
  127.   t->data = dato;
  128.   t->next = NULL;
  129. }
  130.  
  131. void insertAfter(int llave, int dato) {
  132.  
  133.  
  134.  
  135.  
  136. }
  137.  
  138. int find(int datoBuscado) {
  139. struct node *temp;
  140.   temp = start;
  141.   if (temp == NULL) {
  142.      printf("Linked list vacía.\n");
  143.      return -2;
  144.   }
  145.   while (temp->next != NULL) {   // busca
  146.      if(temp->data == datoBuscado) {
  147.       found = temp;
  148.  return temp->data;
  149.  } else {
  150.   temp = temp->next;
  151.  }
  152.   }
  153.   if(temp->data == datoBuscado) { // en caso de que sea el último
  154.   found = temp;
  155.       return temp->data;
  156. }
  157. return -1;
  158. }
  159.  
  160. void traverse() {
  161.   struct node *t;
  162.   t = start;
  163.   if (t == NULL) {
  164.      printf("Linked list vacía.\n");
  165.      return;
  166.   }
  167.   printf("Hay %d elemento(s) en la linked list.\n", count);
  168.   while (t->next != NULL) {
  169.      printf("%d -> ", t->data);
  170.      t = t->next;
  171.   }
  172.   printf("%d\n", t->data);
  173. }
  174.  
  175. void deleteFirst() {
  176.   struct node *t;
  177.   int n;
  178.   if (start == NULL) {
  179.      printf("Linked list vacía.\n");
  180.      return;
  181.   }
  182.   n = start->data;
  183.   t = start->next;
  184.   free(start);
  185.   start = t;
  186.   count--;
  187.   printf("%d eliminado del inicio de la linked list.\n", n);
  188. }
  189.  
  190. void deleteLast() {
  191.   struct node *t, *u;
  192.   int n;
  193.   if (start == NULL) {
  194.      printf("Linked list vacía.\n");
  195.      return;
  196.   }
  197.  
  198.   count--;
  199.  
  200.   if (start->next == NULL) { // un solo nodo en la lista
  201.      n = start->data;
  202.      free(start);
  203.      start = NULL;
  204.      printf("%d eliminado del final de la linked list.\n", n);
  205.      return;
  206.   }
  207.  
  208.   t = start;
  209.  
  210.   while (t->next != NULL) {
  211.      u = t;
  212.      t = t->next;
  213.   }
  214.  
  215.   n = t->data;
  216.   u->next = NULL;
  217.   free(t);
  218.  
  219.   printf("%d eliminado del final de la linked list.\n", n);
  220. }
  221.  
  222. void create() {
  223. insertFirst(444);
  224. insertFirst(333);
  225. insertFirst(222);
  226. insertFirst(111);
  227. }
  228.  
4  Programación / Programación C/C++ / estructuras y lectura de archivos en C en: 30 Mayo 2020, 06:25 am
 :-\Hola tengo que realizar un programa haciendo uso de estructuras dinamicas y lectura de archivos, pero no puedo hacer correctamente la extracción de los archivos y guardarlos en arreglos.
Solo guarda el nombre y la cantidad, pero el autor y el precio no.

Este es mi código:
Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. typedef struct{
  6.    char *nombre;
  7.    char *autor;
  8.    int cantidad;
  9.    int precio;
  10. }libros;
  11. libros *l;
  12.  
  13. void menu();
  14. void vaciar(char temp[]);
  15. void copiarNombre(char temp[],int i);
  16. void copiarAutor(char temp[],int i);
  17.  
  18. int main(){
  19.    char temp[50],aux;
  20.    int contador = 0;
  21.  
  22.    FILE *fichero;
  23.    fichero = fopen("libros.txt","rt");
  24.    if(fichero == NULL){
  25.        printf("No se ha encontrado el documento\n");
  26.        return 0;
  27.    }
  28.    while(!feof(fichero)){
  29.        fgets(temp,50,fichero);
  30.        contador++;
  31.    }
  32.    rewind(fichero);
  33.    l = (libros*)malloc(contador*sizeof(libros));
  34.    if(l == NULL){
  35.        printf("NO SE HA PODIDO RESERVAR LA MEMORIA\n");
  36.        return 0;
  37.    }
  38.    for(int i=0;!feof(fichero); i++){
  39.        vaciar(temp);
  40.        aux = '0';
  41.        for(int j=0; aux != ','; j++ ){
  42.                aux = fgetc(fichero);
  43.                if(aux != ','){
  44.                    temp[j] = aux;
  45.                }
  46.        }
  47.        copiarNombre(temp,i);
  48.        copiarAutor(temp,i);
  49.        fgets(temp,4,fichero);
  50.        l[i].cantidad = atoi(temp);
  51.        fgets(temp,5,fichero);
  52.        l[i].precio = atoi(temp);
  53.       printf("Precio: %d\n",l[i].precio);
  54.  
  55.    }
  56.    fclose(fichero);
  57.  
  58.    getchar();
  59.    return 0;
  60. }
  61.  
  62. void menu(){
  63.    int opc;
  64.  
  65.    printf("\t\t\tLIBRERIA FI\n\n");
  66.    printf("1. Leer inventario inicial\n");
  67.    printf("2. Mostrar inventario de existencias\n");
  68.    printf("3. Vender libros\n");
  69.    printf("4. Informe de ventas\n");
  70.    printf("5. Salir\n");
  71.    printf(" \nIngrese el numero correspondiente a la operacion que desea realizar: ");
  72.    scanf("%d",&opc);
  73. }
  74.  
  75. void vaciar(char temp[]){
  76.    for(int i=0; i<50; i++){
  77.        temp[i] = '\0';
  78.    }
  79. }
  80.  
  81. void copiarNombre(char temp[],int i){
  82.    int longitud;
  83.    longitud = strlen(temp)+1;
  84.    l[i].nombre = (char*)malloc(longitud*sizeof(char));
  85.    if(l[i].nombre == NULL){
  86.        printf("No se ha podido reservar memoria\n");
  87.        return 0;
  88.    }
  89.    strcpy(l[i].nombre,temp);
  90. }
  91.  
  92. void copiarAutor(char temp[],int i){
  93.    int longitud;
  94.    longitud = strlen(temp)+1;
  95.    l[i].autor = (char*)malloc(longitud*sizeof(char));
  96.    if(l[i].autor == NULL){
  97.        printf("No se ha podido reservar memoria\n");
  98.        return 0;
  99.    }
  100.    strcpy(l[i].autor,temp);
  101. }


mi archivo de texto es el siguiente:
Código:
La casa de los espiritus,Isabel Allende,5,345
La Metamorfosis,Franz Kafka,3,560
La Odisea,Homero,7,200
El Principito,Antoine de Saint-Exupery,2,499
El Laberinto de la Soledad,Octavio Paz,1,150
El tunel,Ernesto Sabato,3,100
Los miserables,Victor Hugo,5,290
Cuentos de amor de locura y de muerte,Horacio Quiroga,4,563
El amor en lo tiempos de colera,Gabriel Garcia Marquez,6,218


MOD: Utiliza las etiquetas de Código GeSHi para los fragmentos de código
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines