2011-03-23 17 views
5

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.

Odpowiedz

2

Czy prawdopodobnie używasz literału ciągu jako celu dla twojego zestawu? W takim przypadku [EAX] aka * s może wskazywać na pamięć tylko do odczytu.

Edit:
Zakładając test i toto są takie same zmienne, powinno być naprawdę const char* test= becase ciąg dosłownym jest tylko do odczytu. Wypróbuj char test[] = zamiast tego, aby utworzyć tablicę zawierającą kopię literału.

Edit2:
Mam javascript problemu dzisiaj, więc nie mogę dodawać komentarze.

W każdym razie, nowym problemem jest mov [eax],edx, który przechowuje 4 bajty (z których niektóre to 0). Poprzedni sklep przechowywał 1 bajt na raz.

Edit3:
@stupid_idiot - po raz pierwszy napisał, że EDX jest 2 bajty (mylić go z dx), i że stała przed seing komentarz. Szczery! :-)

+1

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

+0

Bo Persson: ok, nie ma problemu :) – Pyjong

+0

Dziękuję bardzo, że działało idealnie! – Aymeric

1

myślę chcesz:

mov [eax], dl 

ten przesuwa wartośćw rejestrze dl na adres pamięci wskazanym przez eax.

+0

Próbowałem tego przed podaniem mojego kodu, ale wciąż miałem ten sam błąd. – Aymeric

+0

Cóż, czy 'eax' zawiera to, w co wierzysz, że powinno? Debugger byłby tu twoim najbardziej przydatnym narzędziem. –

+0

EAX zawiera to, co chcę, ponieważ jeśli skomentuję nieprzerwaną linię, zwróci mi ten sam ciąg. – Aymeric

Powiązane problemy