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

x86エミュレータやFPGA、WebGLにお熱なd-kamiがマイペースに書くブログ

memcpy作り直し

memcpyをMOVSBを使って作り直した。MOVSBは[DS:ESI]にあるバイトを[DS:EDI]にコピーする命令。DF(ディレクションフラグ)の状態に応じてESIとEDIをインクリメントか、デクリメントする。今回はCLD命令でDFをクリアして、インクリメントさせている。そしてMOVSBの前にREPを付けることでECX回だけ繰り返している。しかし、string.hに定義されている関数を全部アセンブラで書いていくのは大変だな。しかし、void*をchar*に変換できないのはなんでだろう?

memcpy:

    CLD
    MOV EDI, [ESP + 4]
    MOV ESI, [ESP + 8]
    MOV ECX, [ESP + 12]
    MOV EAX, EDI;memcpyの返り値

    REP MOVSB

    RET