Czy to implementujesz na potrzeby konkretnego programu, czy w celach edukacyjno-rozrywkowych? Jeżeli to pierwsze, to jaki sens ma dublowanie tego, co jest na wyposażeniu biblioteki standardowej? Moim zdaniem kompilator wkompiluje tylko te funkcje, które są używane, a nie cały kod wskazany przez include.
W ASM można by napisać mniej więcej tak: Najpierw kopiujesz do rejestrów lub obszarów pamięci wskaźnik na obszar źródłowy i docelowy (każdy po 4 bajty). Następnie do rejestru A kopiujesz długość obszaru (liczbę bajtów).
Jeden z możliwych sposobów, jaki wymyśliłem na szybko, przedstawiam poniżej
Rozkazy są wymyślone, żeby zilustrować ideę, w rzeczywistości mogą się różnić.
; Odczytanie dlugosci obszaru jako licznik petli
MOV A, DlugoscObszaru
:LOOP
; Odłożenie licznika z A na stos
PUSH A
; Przepisanie bajtu z bieżącego adresu źródłowego do bieżącego adresu docelowego
MOV A, @AdresZrodlowy
MOV @AdresDocelowy, A
; Odczytanie adresu źródłowego, zwiększenie o 1 i zapisanie adresu źródłowego
MOV A, AdresZrodlowy
INC A
MOV AdresZrodlowy, A
; Odczytanie adresu docelowego, zwiększenie o 1 i zapisanie adresu docelowego
MOV A, AdresDocelowy
INC A
MOV AdresDocelowy, A
; Pobranie licznika ze stosu do A
POP A
; Dekrementacja licznika
DEC A
; Jeżeli A != 0, to przeskok do etykiety "LOOP"
JNZ LOOP