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.
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
Bo Persson: bien, no hay problema :) – Pyjong
¡Muchas gracias, funcionó perfectamente! – Aymeric