Я бы сказал, что это потому, что автор этого кода, вероятно, не знал, что он делает :-). 16-битные версии этих инструкций длиннее и не быстрее. Фактически, они, вероятно, приведут к частичному сбою регистра в следующей инструкции, которая использует ECX (то есть MOV).
Также обратите внимание, что переход может быть безопасно перемещен одной инструкцией ранее (после DEC), так как DEC уже устанавливает ZF, когда его выход равен нулю. Это может немного упростить код.
Так вот, как бы я написал этот фрагмент кода:
mov eax, [count]
xor ecx, ecx
dec eax
jz next
bsr ecx, eax
inc ecx
next:
mov [maskWidth], ecx
Кроме того, мотивация для перехода к сборке здесь, кажется, использует инструкцию BSR, которая не имеет никакого эквивалента в языке C или библиотеке. Вы можете избежать использования ассемблера, используя для этого встроенную функцию, специфичную для компилятора. Хотя они по своей природе не являются переносимыми, ни одна из них не является встроенной сборкой.
В GCC эквивалентная функция будет выглядеть следующим образом:
unsigned int find_maskwidth(unsigned int itemCount)
{
if(itemCount <= 1)
return 0;
else
return 32 - __builtin_clz(itemCount - 1);
}
Намного более читабельно, не так ли?