«Ошибка сегментации» при перекодировании memset - PullRequest
5 голосов
/ 23 марта 2011

Я запустил ASM несколько дней назад и начал перекодировать все простые функции, которые предлагает нам libc, например strlen, strchr или memset. У меня не было никаких проблем, пока я не попытался перекодировать memset.

Вот прототип функции C:

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

Вот мой код 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

И это главное, что я использую для своего теста

#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);
}

Я немного растерялся в регистрах использования, поэтому, если я допустил какую-либо большую ошибку, пожалуйста, дайте мне знать.

[РЕДАКТИРОВАТЬ] Основная проблема была решена (больше нет ошибок или ошибок). Но у меня все еще есть одна маленькая проблема. Я получаю строку «bbbbb», когда она должна быть «bbbbbsatest»

Спасибо, Еписмен.

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

Возможно, вы используете строковый литерал в качестве цели для вашего memset? В этом случае [EAX] aka * s может указывать на постоянную память.

Edit:
Если предположить, что test и toto - это одна и та же переменная, она должна быть const char* test=, потому что строковый литерал доступен только для чтения. Попробуйте вместо этого char test[] = создать массив, содержащийign копию литерала.

Edit2:
У меня сегодня проблема с JavaScript, поэтому я не могу добавлять комментарии.

В любом случае, новая проблема - mov [eax],edx, которая хранит 4 байта (некоторые из которых равны 0). Предыдущее хранилище move [eax],dl хранило 1 байт за раз.

Edit3:
@stupid_idiot - я сначала написал, что edx составляет 2 байта (перепутал его с dx), и исправил это перед тем, как отправлять комментарий. Честное слово! : -)

1 голос
/ 23 марта 2011

Я думаю, что вы хотите:

mov [eax], dl

Это перемещает значение в регистре dl на адрес памяти , обозначенный eax.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...