2011-03-23 18 views
5

Inicié ASM hace unos días y comencé a recodificar toda la función simple que libc nos ofrece como strlen, strchr o memset. No tuve ningún problema hasta que intenté grabar el memset.'Segmentation Fault' durante la recodificación de memset

Aquí es el prototipo de la función C:

void *memset(void *s, int c, size_t n); 

Aquí está mi código ASM:

[BITS 32] 

global my_memset 

my_memset: 
    push ebp 
    mov  ebp, esp 

    mov  eax, [ebp+8] 
    mov  edx, [ebp+12] 
    mov  ecx, [ebp+16] 

myloop: 
    mov  [eax], edx 
    add  eax, 1 
    loop myloop 

endfunc: 
    mov  eax, [ebp+8] 
    leave 
    ret 

Y esta es la principal que utilizo para mi prueba de

#include <stdio.h> 

void *my_memset(void *s, int c, size_t n); 

void main(void) 
{ 
    char test[] = "thisisatest"; 

    printf("%s\n", test); 
    my_memset(test, 'b', 5); 
    printf("%s\n", test); 
} 

Estoy un poco perdido en los registros de uso, así que si cometí un gran error, háganmelo saber.

[EDITAR] El problema principal ha sido resuelto (no más segfaults o errores). Pero todavía tengo un último -pequeño- problema. La cadena que recibo es 'bbbbb' cuando debería ser 'bbbbbsatest'

Gracias, Ephismen.

Respuesta

2

¿Posiblemente está utilizando una cadena literal como objetivo para su memset? En ese caso, [EAX] aka * s, puede apuntar a la memoria de solo lectura.

Editar:
Suponiendo test y toto son la misma variable, en realidad debería ser const char* test= becase una cadena literal es de sólo lectura. Pruebe char test[] = en su lugar para crear una matriz que contenga una copia del literal.

Edit2:
Tengo un problema Javascript a día de hoy, por lo que no se puede agregar comentarios.

De todos modos, el nuevo problema es mov [eax],edx que almacena 4 bytes (algunos de los cuales son 0). La tienda anterior move [eax],dl almacenaba 1 byte a la vez.

Edit3:
@stupid_idiot - La primera vez que escribió que EDX es de 2 bytes (confundido con dx), y se fija antes de que seing su comentario. ¡Honesto! :-)

+1

mov [eax], edx almacena 4 bytes, pero sí tienes razón. esto es lo que termina la cadena con 0 después de la última iteración. Totalmente no me di cuenta de eso. usando DL o DH en lugar de edx debería arreglarlo, sin embargo, no cambie las llaves. – Pyjong

+0

Bo Persson: bien, no hay problema :) – Pyjong

+0

¡Muchas gracias, funcionó perfectamente! – Aymeric

1

pienso que deseas:

mov [eax], dl 

Esto mueve el valor en el Registro dl a la dirección de memoria indicado por eax.

+0

Intenté esto antes de dar mi código pero todavía tenía el mismo error. – Aymeric

+0

Bueno, ¿'eax' contiene lo que crees que debería? Un depurador sería su herramienta más útil aquí. –

+0

EAX contiene lo que quiero, ya que si comento la línea que no funciona, me devuelve la misma cadena. – Aymeric

Cuestiones relacionadas