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

Aym*_*ric 5 c assembly

我几天前开始使用ASM并开始重新编码libc提供的所有简单函数,如strlen,strchr或memset.在我尝试重新编码memset之前,我没有任何问题.

这是C函数的原型:

void *memset(void *s, int c, size_t n);
Run Code Online (Sandbox Code Playgroud)

这是我的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
Run Code Online (Sandbox Code Playgroud)

这是我用于测试的主要内容

#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);
}
Run Code Online (Sandbox Code Playgroud)

我在使用寄存器上有点迷失,所以如果我犯了任何大错,请告诉我.

[编辑]主要问题已解决(不再有段错误或错误).但我仍然有一个最后的小问题.我收到的字符串是'bbbbb',它应该是'bbbbbsst'

谢谢Ephismen.

Bo *_*son 2

您是否可能使用字符串文字作为内存集的目标?在这种情况下,[EAX] 又名 *s,可以指向只读内存。

编辑:
假设testtoto是相同的变量,它实际上应该是const char* test=因为字符串文字是只读的。尝试char test[] =创建一个包含文字副本的数组。

Edit2:
我今天遇到了 javascript 问题,所以我无法添加评论。

不管怎样,新的问题是mov [eax],edx它存储了4个字节(其中一些是0)。以前的存储move [eax],dl一次存储 1 个字节。

Edit3:
@stupid_idiot - 我首先写道 edx 是 2 个字节(将其与 dx 混淆),并在看到您的评论之前修复了该问题。诚实的!:-)