もう少し引っ張ってみる
先日のintncmp()だのintcmp()だのは何がしたかったかというと、x86+Windowsを前提に考えると現状では32bitレジスタを使うわけで、char(8bit)同士の比較ではせっかくの32bitレジスタも下位8bitのみしか使わないので効率が悪いではないか、ということが言いたかっただけです。
BCCでアセンブラ出力したものを以下に載せます。
xor eax,eax cmp esi,eax jle short @13 @12: mov bl,byte ptr [ecx+eax] xor bl,byte ptr [edx+eax] je short @14 mov eax,1 jmp short @15 @14: inc eax cmp esi,eax jg short @12 @13: xor eax,eax
先日のintncmp()を元にchar単位で比較するプログラム(≒strncmp())よりfor文内を抜粋。
xor eax,eax cmp edx,eax jle short @6 @5: mov esi,dword ptr [ecx+4*eax] xor esi,dword ptr [ebx+4*eax] je short @7 mov eax,1 jmp short @8 @7: inc eax cmp edx,eax jg short @5 @6: xor eax,eax
こちらはintncmp()より。
命令自体は同一なのですが、5・6行目の比較の箇所においてBLに格納されるかESIに格納されるかの違いがあります。これはBLが32bitレジスタの下位8bit、ESIは32bitレジスタそのものということになります。レジスタとかについては詳しかったり丁寧だったりするサイトも多いでしょうから適当に調べてください。