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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


  Mostrar Mensajes
Páginas: [1] 2
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 / Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos en: 6 Abril 2022, 17:15 pm
entonce como tal hice lo siguiente:

mov ebx, 10
idiv ebx ; dividir entre 10

para hacerlo con los 32 bits, pero lo que se va a dividir entre 10, tengo entendido que es EAX:EDX, o sea que el valor de mi suma deberìa estar reaprtido entre esos 2 registros no? y no sè como realizarlo :-\
3  Programación / ASM / Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos en: 6 Abril 2022, 16:31 pm
Una duda que me surgió hace un momento, es que mi resultado de la suma está en eax y la división se haria en ax no? o sea ax/10, como hago para que mi resultado de la suma estè solo en ax?
4  Programación / ASM / Re: Imprimir en pantalla el resultado de la suma de 2 números de 2 dígitos en: 6 Abril 2022, 15:27 pm
DE acuerdo, o sea que podrìa usar mi còdigo que tengo para convertir de caracter a número pero sumandole el '0' en lugar de restarlo?
Y para imprimirlo habia visto que tenía que separarlo en caracteres para mostrar uno por uno, eso es cierto?
5  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.  
6  Programación / Programación C/C++ / Re: Linked List en: 18 Noviembre 2020, 04:50 am
Muchas Gracias, ya lo resolví. Excelente explicación.
7  Programación / Programación C/C++ / Re: Linked List en: 18 Noviembre 2020, 04:13 am
Si, lo modifiqué, pero sigo con el mismo problema
Código
  1. void insertAfter(int llave, int dato) {
  2.    struct node *l;
  3.    l = malloc(sizeof(struct node));
  4.    count++;
  5.     if (start == NULL) { // Primera vez
  6.      start = l;
  7.      start->data = dato;
  8.      start->next = NULL;
  9.      return;
  10.   }
  11.    found->data = llave;
  12.    l->data = dato;
  13.    found->next = l;
  14.  
  15. }
8  Programación / Programación C/C++ / Re: Linked List en: 18 Noviembre 2020, 03:57 am
Si, ya llevo una parte, la adjunto a continuación, pero mi problema es que si inserta el número después del número que le pido, pero los elementos que estaban después ya no los imprime.
Código
  1. void insertAfter(int llave, int dato) {
  2.    struct node *l,*t;
  3.    l = malloc(sizeof(struct node));
  4.    count++;
  5.     if (start == NULL) { // Primera vez
  6.      start = t;
  7.      start->data = dato;
  8.      start->next = NULL;
  9.      return;
  10.   }
  11.    found->data = llave;
  12.    l->data = dato;
  13.    found->next = l;
  14.  
  15. }
  16.  
9  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.  
10  Programación / Programación C/C++ / Re: Arreglos de cadenas en C en: 4 Junio 2020, 04:14 am
Te lo agradezco mucho, me ayudó bastante.
Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines