2010-04-26 14 views
7

Vous devez écrire un maximum de deux instructions dans l'assemblage pour effectuer les opérations suivantes:Ecrire un maximum de deux instructions pour effacer, définir et compléter certains bits dans le AL enregistrer

  1. effacer des bits 0 et 7 du registre AL, c.-à-d. Les faire 0
  2. Définir les bits 3 et 4 du registre AL, c'est-à-dire les faire 1.
  3. Compléter les bits 1 et 5 du registre AL.
  4. Conserver tous les autres bits du registre AL sans modifier leurs valeurs.
+2

Ça sent comme les devoirs ... –

+3

La solution d'instruction *** trois ***: 'al -> al & 0b01111110 | 0b00011000^0b00100010'. La partie difficile est de réduire cela à 2 instructions. – kennytm

+0

Je suis d'accord avec Paliath. – Puppy

Répondre

9

L'astuce ici consiste à effectuer les opérations suivantes:

  1. utilisation d'une instruction OR à réglé bits 0, 3, 4 et 7

  2. utiliser une instruction XOR pour complément les bits 0, 1, 5 et 7

Notez que les bits 0 et 7 sont d'abord définis dans (1), puis effacés ed dans (2).

Je vous laisserai les instructions asm, puisque c'est votre devoir, après tout.

+2

Merci, monsieur Paul. Cela devrait être le code: OU AL, 10011001 XOR AL, 10100011 – Nick

+0

@Nick: oui, cela semble à peu près juste, en fonction exactement quel processeur et assembleur vous utilisez. –

+1

une autre façon est d'effacer les bits 0, 3, 4, 7, puis compléter les bits 1, 3, 4, 5. [Clang peut faire cette optimisation] (https://godbolt.org/g/yan2Kr) –

4

Une instruction DB définissant un tableau de 256 valeurs de «résultat» et une instruction de déplacement pour déplacer un élément de ce tableau dans al, en utilisant la valeur actuelle de al comme index.

Cela ne fonctionnerait-il pas?

On pourrait même soutenir qu'il s'agit même d'une solution à instruction unique, puisque le DB n'est pas vraiment une instruction qui s'exécute à l'exécution, mais plutôt un déclaratif à la compilation.

+0

Pouvez-vous clarifier plus s'il vous plaît? – Nick

+0

Il propose une table de correspondance avec une valeur de résultat pour chacune des 256 valeurs d'entrée possibles. La liste est créée à l'aide de la commande DB. La recherche est effectuée en utilisant une simple instruction «move AL, start + index». – mafu