在不使用MUL,IMUL,SHL,SHR,LOOP指令的情况下将数字相乘

时间:2018-04-15 10:17:29

标签: assembly x86 multiplication

是否可以在不使用x86汇编语言的指令MUL,IMUL,SHL,SHR,LOOP,JMP的情况下计算乘法结果?

4 个答案:

答案 0 :(得分:1)

以下代码将乘以寄存器ecxedx的内容,并将结果存储在寄存器eax中。寄存器ebxedx的内容将被销毁:

  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"指令,但任何条件跳转指令:

在没有条件跳转指令的情况下进行乘法有点困难但并非不可能;以下示例执行此操作(输入:ecxedx,输出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 ecxjne 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次。这样您就可以在没有loopjump指令的情况下执行此操作: - )

当然,那么你可以只有paxmul指令为你做乘法 - 技术上不是mul但毫无疑问是针对问题的精神。 / p>

但是,说实话,这个问题可能被视为没有实际意义,因为你实际上很难尝试找到一个没有你列出的说明的CPU。