mul – команда умножения беззнаковых целых чисел. Для примера рассмотрим умножение двух 8-разрядных чисел, результат будет располагаться в 16-разрядном. Пусть al=13, пусть cl=11. Тогда после выполнения mul al регистр al умножится на регистр cl, и результат будет помещён в ax (то есть ax будет равно 143). Так как результат предполагается вдвое длиннее множителей, то переполнения в принципе не может быть. Следует иметь ввиду, что команда mul выполняется довольно долго по сравнению с командами типа add, sub, shl, но в современных процессорах этот разрыв уже не так значителен. Я считаю, что если для замены команды mul требуется больше двух сдвигов и сложений, то заменять её не имеет смысла, так как во-первых, программа усложняется, во-вторых, теряется общность, в-третьих, требуются дополнительные регистры, и в-четвёртых, выигрыша в производительности практически не будет. Я проводил кое-какие тесты. Об этом можно почитать здесь