重新编码memset时出现“分段错误”

时间:2011-03-23 09:05:02

标签: c assembly

我几天前开始使用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'

谢谢你,Ephismen。

2 个答案:

答案 0 :(得分:2)

您是否可以使用字符串文字作为memset的目标?在这种情况下,[EAX] aka * s,可以指向只读存储器。

修改
假设testtoto是同一个变量,它应该是const char* test=,因为字符串文字是只读的。请尝试使用char test[] =创建一个包含文字副本的数组。

<强> EDIT2:
我今天有一个javascript问题,所以我无法添加评论。

无论如何,新问题是mov [eax],edx,它存储4个字节(其中一些是0)。前一个商店move [eax],dl一次存储1个字节。

<强> EDIT3:
@stupid_idiot - 我首先写道,edx是2个字节(与dx混淆),并在发表你的评论之前解决了这个问题。诚实! : - )

答案 1 :(得分:1)

我想你想:

mov [eax], dl

这会将dl寄存器中的移动到eax指示的内存地址