80286: Какой самый быстрый способ умножить на 10? - PullRequest
2 голосов
/ 04 апреля 2020

Чтобы умножить число на любое кратное 2, я буду сдвигать его много раз.

Существует ли какая-либо такая техника для умножения числа на 10 за меньшее количество циклов?

1 Ответ

4 голосов
/ 05 апреля 2020

У 80286 не было переключателя ствола, который был представлен с 80386. Согласно таблицам синхронизации в документации Microsoft Macro Assembler 5.0 (1987), SHL reg, immed8 занимает 5 + n циклов, тогда как SHL reg, 1 занимает 2 цикла. ADD reg, reg занимает 2 цикла, как и MOV reg, reg . IMUL reg16, immed занимает 21 цикл. Следовательно, самый быстрый способ умножения на десять будет выглядеть так:

           ;       // cycles
shl ax, 1  ; *2    // 2
mov bx, ax ; *2    // 4
shl ax, 1  ; *4    // 6
shl ax, 1  ; *8    // 8
add ax, bx ; *10   // 10

или, альтернативно:

           ;      // cycles
mov bx, ax ; *1   // 2
shl ax, 1  ; *2   // 4
shl ax, 1  ; *4   // 6
add ax, bx ; *5   // 8
shl ax, 1  ; *10  // 10

Десять циклов в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...