80286:乘以10最快的方法是什么?
80286: Which is the fastest way to multiply by 10?
要将一个数乘以 2 的任意倍数,我会将它移动那么多次。
有没有这样的技巧可以在更少的周期内将数字乘以10?
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
十个循环。
要将一个数乘以 2 的任意倍数,我会将它移动那么多次。
有没有这样的技巧可以在更少的周期内将数字乘以10?
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
十个循环。