是否可以在不使用x86汇编语言的指令MUL,IMUL,SHL,SHR,LOOP,JMP的情况下计算乘法结果?
答案 0 :(得分:1)
以下代码将乘以寄存器ecx
和edx
的内容,并将结果存储在寄存器eax
中。寄存器ebx
和edx
的内容将被销毁:
mov ebx, 1
mov eax, 0
repeat:
test ecx, ebx
jz dontadd
add eax, edx
dontadd:
add edx, edx
add ebx, ebx
jnz repeat
没有...... LOOP
如果" LOOP"不仅涵盖" LOOP"指令,但任何条件跳转指令:
在没有条件跳转指令的情况下进行乘法有点困难但并非不可能;以下示例执行此操作(输入:ecx
和edx
,输出eax
,所有使用的寄存器的内容都将被销毁):
mov ebx, 1
mov eax, 0
not ecx
# Repeat the following code 32 times:
mov esi, ebx
and esi, ecx
dec esi
and esi, edx
add eax, esi
add edx, edx
add ebx, ebx
# (repeat the code here)
答案 1 :(得分:1)
是否可以在不使用x86汇编语言的指令MUL,IMUL,SHL,SHR,LOOP,JMP的情况下计算乘法结果?
是
没有MUL,正常的方法是" SHIFT LEFT和TEST and ADD"在循环中,像这样:
result = 0;
while(a > 0) {
result = result << 1;
if( a & 0x80000000 != 0) {
result = result + b;
}
a = a << 1;
}
请注意,对于32位整数,这样的循环将具有(最多)32次迭代。
您可以使用添加内容替换这些班次(例如shl eax, 1
替换为add eax, eax
);并且您可以使用显式循环替换LOOP
(例如dec ecx
,jne next
)或展开循环(重复代码32次)。这些替代品可能会提高性能。
无符号乘法后,IMUL
可以替换为将值转换为正数并使用无符号乘法的分支。例如。像:
if(a < 0) {
a = -a;
if(b < 0) {
b = -b
return a*b; // Unsigned multiplication
} else {
return -a*b; // Unsigned multiplication
}
} else {
if(b < 0) {
b = -b
return -a*b; // Unsigned multiplication
} else {
return a*b; // Unsigned multiplication
}
}
答案 2 :(得分:1)
对于完整的表格查找和logarithm, addition and exponentiation,你仍然可以做到 table lookup of squares and subtraction:ab = (a + b)²/ 4 - (a-b)²/ 4 。
答案 3 :(得分:0)
没有乘法指令的CPU通常可以通过重复添加来执行此操作,但如果没有循环,则非常很难。
但是,由于您没有指定您感兴趣的特定 CPU,我会假设其中一个指令如下:
add rt, rs, count
指令rs
rt
恰好count
次。这样您就可以在没有loop
或jump
指令的情况下执行此操作: - )
当然,那么你可以只有paxmul
指令为你做乘法 - 技术上不是mul
但毫无疑问是针对问题的精神。 / p>
但是,说实话,这个问题可能被视为没有实际意义,因为你实际上很难尝试找到一个没有你列出的说明的CPU。