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.
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
Bo Persson: ok, không có vấn đề :) – Pyjong
Cảm ơn bạn rất nhiều nó đã làm việc hoàn hảo! – Aymeric