マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

memsetを作ってみた

C++版MessagePackを入れる使うために必要なmemsetをnasmで実装してみた。STOSB使ってるが、これのループ版とかないのだろうか?

memset:
_memset:
;ディレクションフラグクリア
    CLD

;引数
    MOV EDI, [ESP + 4]
    MOV EAX, [ESP + 8]
    MOV ECX, [ESP + 12]

;返り値退避用
    MOV ESI, EDI

;値をセットするループ
set_loop:
;ECXが0ならループ終了
    OR ECX, ECX
    JZ set_end

;ALの値を[ES:EDI]に入れて、ECXの値を1下げてループへ
    STOSB    
    SUB ECX, 1
    JMP set_loop

set_end:
;返り値をEAXに設定
    MOV EAX, ESI
    RET