memsetを(自分も)作ってみた

ぼーっとtwitterを眺めたら[twitter:@d_kami]さんのd:id:d-kami:20101004が流れてきたので自分も書き書き・・・

#include <stdio.h>
#include <string.h>
#include <assert.h>

__declspec( naked )
void *_memset( void *s, int c, size_t n )
{
	__asm {
		PUSH	EDI			; cdeclではEDIは潰しちゃダメらしいので退避
		MOV	EDI, [ESP+08h]		; void *s
		MOV	EAX, [ESP+0Ch]		; int c
		MOV	ECX, [ESP+10h]		; size_t n

		REP	STOSB			; REPプレフィックスを用いて連続コピー

		POP	EDI			; EDIを元に戻す

		MOV	EAX, [ESP+04h]		; return s
		RET
	}
}

int main()
{
	char	a[100];
	char	b[100];

	memset( a, 0, sizeof( a ) );
	_memset( b, 0, sizeof( b ) );
	assert( !memcmp( a, b, sizeof( a ) ) );

	memset( a, 10, 10 );
	_memset( b, 10, 10 );
	assert( !memcmp( a, b, sizeof( a ) ) );

	memset( a, -1, 0 );
	_memset( b, -1, 0 );
	assert( !memcmp( a, b, sizeof( a ) ) );

	memset( a, -1, sizeof( a ) );
	_memset( b, -1, sizeof( b ) );
	assert( !memcmp( a, b, sizeof( a ) ) );

	puts( "test complete!" );

	return 0;
}

REPプレフィックス使うとやっぱり短いですね〜。

・・・はい、これだけです、すみません><