Aller au contenu

Multiplication efficace en assembleur

version python

def multiplication(a, b):
    position = 0
    puissance_position = 1
    resultat = 0
    while puissance_position <= a:
        if (a & puissance_position) != 0:
            resultat = resultat + (b << position)
        position = position + 1
        puissance_position = puissance_position + puissance_position
    return resultat

print(multiplication(403000078586798780089,567687987987987987987987))
  • & est l'opérateur pour le AND binaire en python : a & puissance_position != 0 est une manière de tester que le bit n°position vaut 1.
  • << est l'opérateur pour le décalage binaire à gauche (LSL en assembleur). Décaler à gauche de \(n\) bits revient à multiplier par \(2^n\).

explication sur un exemple :

\(100110_2 \times 11011_2 = (2^1 + 2^2 + 2^5)\times11011_2\)

\(=2^1\times11011_2 + 2^2\times11011_2 + 2^5\times11011_2\)

\(=(11011_2 << 1) + (11011_2 << 2) + (11011_2 << 5)\)

\(=110110_2 + 1101100_2 + 1101100000_2\)

version assembleur

      INP R0,2
      INP R1,2
      MOV R3,#1
      //R4 : position, R3 : puissance_position
      //R5 : resultat
boucle:
      CMP R3,R0
      BGT fin
      AND R6,R0,R3 // R6 : variable temporaire pour (a & puissance_position)
      CMP R6,#0
      BEQ suite
      LSL R7,R1,R4 // R7 : variable temporaire pour (b << position)
      ADD R5,R5,R7
suite:
      ADD R4,R4,#1
      ADD R3,R3,R3
      B boucle
fin:
      OUT R5,4
      HALT