我几天前开始使用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。
答案 0 :(得分:2)
您是否可以使用字符串文字作为memset的目标?在这种情况下,[EAX] aka * s,可以指向只读存储器。
修改强>
假设test
和toto
是同一个变量,它应该是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
指示的内存地址。