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: p>
Supposons que votre langage de montage ne comprend que les instructions suivantes: P>
'Inc Reg' code> em>: incrémente un registre donné par un. li>
-
'déc. REG' code> em>: Décrémenter un registre donné par un. li>
-
'jnz label' code> em>: saute à une étiquette donnée si le résultat de l'instruction précédente n'était pas zéro. LI>
-
'helt' code> em>: cesse d'exécuter. Li>
ul>
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. P>
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>
P.s. À cause de cette question, je n'ai pas eu la question de la mise en œuvre de la question «my_atoi ()» ..: - ( p>
Merci! P>
4 Réponses :
Je ne vais pas donner la réponse complète, mais la clé est que vous devez définir un une fois que vous Demandez aux routines MOV CODE> routine vous-même. En supposant
déc x code> où
x code> détient 0 produit un numéro négatif (ou très grand), qui peut être fait comme suit:
MOV 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 code> pour obtenir
jnz code> pour fonctionner et dans la routine de multiplication, vous devez terminer avec une soustraction. P> p>
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
L'instruction
Oui, do {} tandis que () code> 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 code> en avance sur votre normale do {} tandis que des boucles.
J'avais juste cette tâche sur l'entretien JJ. Cela semble être une solution correcte. Corrigez-moi si je me trompe