我几天前开始使用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.
您是否可能使用字符串文字作为内存集的目标?在这种情况下,[EAX] 又名 *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 混淆),并在看到您的评论之前修复了该问题。诚实的!:-)
| 归档时间: |
|
| 查看次数: |
785 次 |
| 最近记录: |