2011-03-23 77 views
5

我幾天前開始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。

回答

2

你可能使用字符串作爲你的memset的目標嗎?在這種情況下,[EAX] aka * s可以指向只讀內存。

編輯:
假設testtoto是相同的變量,它應該是const char* test= becase的字符串文字是隻讀的。請嘗試使用char test[] =,而不是創建一個包含字面值副本的數組。

編輯2:
我今天有一個javascript問題,所以我不能添加評論。

無論如何,新問題是mov [eax],edx其中存儲4個字節(其中一些是0)。先前的商店move [eax],dl一次存儲1個字節。

EDIT3:
@stupid_idiot - 我第一次寫的是EDX是2個字節(帶DX混淆它),固定的seing您的評論之前。誠實! :-)

+1

mov [eax],edx存儲4個字節,但是你是對的。這是在最後一次迭代之後用0終止字符串。我總是沒有意識到這一點。使用DL或DH代替edx應該修復它,但不要改變大括號。 – Pyjong 2011-03-23 12:18:40

+0

Bo Persson:好吧,沒問題:) – Pyjong 2011-03-23 12:26:01

+0

非常感謝你,它完美的工作! – Aymeric 2011-03-23 12:27:15

1

我想你想:

mov [eax], dl 

這使dl寄存器由eax指示的內存地址

+0

我在給我的代碼之前試過,但我仍然有同樣的錯誤。 – Aymeric 2011-03-23 09:09:04

+0

那麼,'eax'是否包含你認爲應該包含的內容?調試器將是您最有用的工具。 – 2011-03-23 09:12:08

+0

EAX確實包含我想要的內容,因爲如果我評論unworking行,它會返回相同的字符串。 – Aymeric 2011-03-23 09:14:30

相關問題