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プレフィックス使うとやっぱり短いですね〜。
・・・はい、これだけです、すみません><