我幾天前開始ASM並開始重新編碼所有簡單的函數libc爲我們提供了像strlen,strchr或memset。在我嘗試重新編碼memset之前,我沒有任何問題。'Segmentation Fault'重新編碼時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。
mov [eax],edx存儲4個字節,但是你是對的。這是在最後一次迭代之後用0終止字符串。我總是沒有意識到這一點。使用DL或DH代替edx應該修復它,但不要改變大括號。 – Pyjong 2011-03-23 12:18:40
Bo Persson:好吧,沒問題:) – Pyjong 2011-03-23 12:26:01
非常感謝你,它完美的工作! – Aymeric 2011-03-23 12:27:15