Zacząłem ASM kilka dni temu i zacząłem przekodowywać wszystkie proste funkcje, które libc oferuje nam, takie jak strlen, strchr lub memset. Nie miałem żadnego problemu, dopóki nie próbowałem recoding memset."Błąd segmentacji" podczas dekodowania pliku
Oto prototyp funkcji C:
void *memset(void *s, int c, size_t n);
Oto mój kod 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
I to jest główny używam dla mojego testu
#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);
}
Jestem trochę zagubiony w rejestrach użytkowania, więc jeśli popełniłem jakiś duży błąd, proszę dać mi znać.
[EDYCJA] Główny problem został rozwiązany (brak więcej błędów lub awarii). Ale wciąż mam jeden ostatni mały problem. Ciąg, który otrzymuję, to "bbbbb", kiedy powinno być "bbbbbsatest".
Dziękuję, Ephismen.
mov [eax], edx przechowuje 4 bajty, ale masz rację. to właśnie kończy łańcuch z 0 po ostatniej iteracji. Nie zdawałem sobie z tego sprawy. przy użyciu DL lub DH zamiast edx powinno to naprawić, nie zmieniaj jednak nawiasów klamrowych. – Pyjong
Bo Persson: ok, nie ma problemu :) – Pyjong
Dziękuję bardzo, że działało idealnie! – Aymeric