7
votes

Mise en œuvre de C = A * B UTILISATION DES COMMANDES INC DEC ET JNZ

J'ai une question très compliquée dans une «nouvelle» assemblée primitive dans l'une de mes entrevues (pourquoi l'enfer requiert une connaissance de l'Assemblée lorsqu'elle m'a dit que les tests de QA basés sur Python ...?), et c'est va comme ça:

Supposons que votre langage de montage ne comprend que les instructions suivantes:

  • 'Inc Reg' : incrémente un registre donné par un.
  • 'déc. REG' : Décrémenter un registre donné par un.
  • 'jnz label' : saute à une étiquette donnée si le résultat de l'instruction précédente n'était pas zéro.
  • 'helt' : cesse d'exécuter.

    Tâche: A et B registres contiennent des valeurs non négatives. Le programme devrait calculer la valeur d'A * B et localiser le résultat en C. De plus, la langue détient des registres C, D, ..., Z, que vous pouvez assumer sont initialisés au programme Démarrer à zéro.

    Il y a peu de points ici qui nécessitaient plus d'attention, comme si vous devez prendre à l'avance que les valeurs A et \ ou B peuvent être zéro .. et multiple par zéro est ... zéro .. c'est sacrément difficile ..

    P.s. À cause de cette question, je n'ai pas eu la question de la mise en œuvre de la question «my_atoi ()» ..: - (

    Merci!


0 commentaires

4 Réponses :


5
votes

Je ne vais pas donner la réponse complète, mais la clé est que vous devez définir un MOV routine vous-même. En supposant déc x x détient 0 produit un numéro négatif (ou très grand), qui peut être fait comme suit: xxx

une fois que vous Demandez aux routines MOV appropriées, vous pouvez implémenter l'addition comme une augmentation et une multiplication répétées en tant qu'élément répété. Dans les deux, vous aurez besoin de l'astuce inc pour obtenir jnz pour fonctionner et dans la routine de multiplication, vous devez terminer avec une soustraction.


0 commentaires

4
votes

briser cette étape par étape:

Original: p>

    # Check if A is zero, and halt if so
    # (So that multiplying by zero gives zero)
    inc A
    dec A  # To set flags
    jnz a_non_zero
    helt  # Multiplying by zero gives zero
a_non_zero:

    # Check if B is zero, and halt if so
    # (So that multiplying by zero gives zero)
    inc B
    dec B  # To set flags
    jnz b_non_zero
    helt  # Multiplying by zero gives zero
b_non_zero:

outer_loop_again:

addition_loop_again:
    inc Z
    inc C
    dec B
    jnz addition_loop_again

move_loop_again:
    inc B
    dec Z
    jnz move_loop_again

    dec A
    jnz outer_loop_again

    # Finished!
    helt


0 commentaires

2
votes

L'instruction peut être vue comme do .. tandis que structure, un exemple avec @ user9876 code: xxx


1 commentaires

Oui, do {} tandis que () Les boucles sont la voie naturelle dans l'ASM ( Pourquoi les boucles sont-elles toujours compilées "faire. .. Quel que soit le style (saut de la queue)? ), mais vous devez vérifier si la boucle doit exécuter zéro fois parce que l'OP dit A ou B peut être zéro. Donc, vous avez besoin d'inc / déc / jnz en tant que si (a == 0) goto en avance sur votre normale do {} tandis que des boucles.



0
votes

J'avais juste cette tâche sur l'entretien JJ. Cela semble être une solution correcte. Corrigez-moi si je me trompe xxx


0 commentaires