2011-03-23 70 views
5

Tôi bắt đầu ASM cách đây vài ngày và bắt đầu mã hóa tất cả hàm libc đơn giản cung cấp cho chúng ta như strlen, strchr hoặc memset. Tôi không có vấn đề gì cho đến khi tôi thử đọc lại bộ nhớ.'Phân đoạn lỗi' trong khi ghi nhớ lại mã số

Đây là nguyên mẫu của hàm C:

void *memset(void *s, int c, size_t n); 

Đây là mã ASM của tôi:

[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 

Và đây là chính tôi sử dụng cho thử nghiệm của tôi

#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); 
} 

Tôi là một chút bị mất trên sổ đăng ký sử dụng, vì vậy nếu tôi đã làm bất kỳ sai lầm lớn xin vui lòng cho tôi biết.

[EDIT] Vấn đề chính đã được giải quyết (không có nhiều lỗi hoặc lỗi). Nhưng tôi vẫn còn một vấn đề nhỏ. Chuỗi tôi nhận được là 'bbbbb' khi nó phải là 'bbbbbsatest'

Cảm ơn bạn, Ephismen.

Trả lời

2

Bạn có thể sử dụng chuỗi ký tự làm mục tiêu cho bộ nhớ của mình không? Trong trường hợp đó, [EAX] aka * s, có thể trỏ tới bộ nhớ chỉ đọc.

Edit:
Giả sử testtoto là biến tương tự, cần thực sự được const char* test= becase một chuỗi chữ là read-only. Thay vào đó, hãy thử char test[] = để tạo một mảng chứa một bản sao của chữ.

Chỉnh sửa2:
Tôi gặp sự cố javascript ngày hôm nay, vì vậy tôi không thể thêm nhận xét.

Dù sao, vấn đề mới là mov [eax],edx lưu trữ 4 byte (một số trong số đó là 0). Cửa hàng trước đó move [eax],dl được lưu trữ 1 byte tại một thời điểm.

Edit3:
@stupid_idiot - lần đầu tiên tôi viết rằng edx là 2 byte (nhầm lẫn nó với dx), và cố định mà trước khi seing nhận xét của bạn. Thật thà! :-)

+1

mov [eax], edx lưu trữ 4 byte nhưng bạn đã đúng. đây là những gì chấm dứt chuỗi với 0 sau lần lặp cuối cùng. Tôi totaly không nhận ra điều đó. bằng cách sử dụng DL hoặc DH thay vì edx nên sửa chữa nó, không thay đổi niềng răng mặc dù. – Pyjong

+0

Bo Persson: ok, không có vấn đề :) – Pyjong

+0

Cảm ơn bạn rất nhiều nó đã làm việc hoàn hảo! – Aymeric

1

Tôi nghĩ rằng bạn muốn:

mov [eax], dl 

này di chuyển giá trị trong dl đăng ký tới địa chỉ bộ nhớ chỉ định bởi eax.

+0

Tôi đã thử điều này trước khi đưa mã của mình nhưng tôi vẫn gặp lỗi tương tự. – Aymeric

+0

À, liệu 'eax' có chứa những gì bạn tin không? Trình gỡ rối sẽ là công cụ hữu ích nhất của bạn ở đây. –

+0

EAX không chứa những gì tôi muốn, vì nếu tôi nhận xét dòng unworking nó trả về cho tôi cùng một chuỗi. – Aymeric

Các vấn đề liên quan