Inverse d'un octet à l'aide de langage d'assemblage
Je suis dans une microprocesseurs classe et nous sommes en utilisant le langage d'assemblage dans Freescale CodeWarrior pour programmer un 68HCS12 de micro-contrôleur. Notre mission, c'est la semaine à revers un octet, donc si l'octet est 00000001, la sortie serait 10000000, ou 00101011 à 11010100. Nous devons utiliser de langage d'assemblage, et ont dit que nous pouvions utiliser pour la rotation des quarts de travail (mais pas uniquement!) pour accomplir cette tâche. Je suis vraiment à une perte à l'endroit où je dois commencer.
OriginalL'auteur dohlfhauldhagen | 2011-02-07
Vous devez vous connecter pour publier un commentaire.
Si vous pouvez épargner les 256 octets de code supplémentaire de la taille, une table de recherche est probablement le moyen le plus efficace pour inverser un octet sur un 68HCS12. Mais je suis assez sûr que ce n'est pas ce que votre instructeur attend.
Pour le "normal" de la solution, envisager les bits de données individuellement. Pour la rotation des quarts de travail vous permettent de déplacer des bits. Pour une première solution, isoler les huit bits (avec bit-à-bit "et" opérations), de les déplacer à leur destination positions (équipes, tourne...), puis de les combiner de nouveau ensemble (avec bit-à-bit "ou" opérations). Ce ne sera pas la plus efficace ou la plus simple de mise en œuvre, mais vous devez d'abord se concentrer sur l'obtention d'un résultat correct -- optimisation peut attendre.
Supposons que votre programme dans sa durée de vie va être fait des milliards de bits reprises. Lorsque vous démarrez le programme que vous venez de faire toutes les 256 possibilités par bits tourne et stocker les résultats dans 256 octets de mémoire contiguë, à partir, disons, à la BASE. Maintenant, quand vous en avez besoin pour inverser les bits d'un registre, il vous suffit de regarder (BASE+valeur). C'est une table de correspondance (LUT). Vous pouvez même coder en dur le LUT à l'assemblée qu'un morceau de 256 constantes si vous pouvez précalculer. Ensuite, il n'y a pas d'init nécessaire. Gagner.
Pour économiser de l'espace sur les 256 octets de la table, vous pouvez avoir un 16 octets du tableau contenant les valeurs pour les quatre bits (amuse-gueules) à la fois. L'algorithme serait alors "revval=revdigit[inval&0x0f]<<4|revdigit[inval>>4]". Si j'étais prof, je voudrais les deux parties où un changement est dans l'indexation et l'autre à l'extérieur.
OriginalL'auteur Thomas Pornin
Conseils: Si vous faites un changement, on obtient peu décalé et un zéro (probablement) est décalée dans le. Où est-ce que décalé peu aller? Vous avez besoin de passer que pour l'autre extrémité du registre de destination ou d'adresse de mémoire.
Je suis sûr qu'il y a 25 ans, je pourrais faire cela dans Z80 code machine sans un assembleur 🙂
Il y a hackier méthodes: graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious (en C, mais qui pourrait être fait dans l'assemblée...)
De plus comme il y a 30 ans!
OriginalL'auteur Spacedman
Tenir compte de deux registres que des piles de bits. Qu'advient-il si vous déplacez un bit à la fois de l'un à l'autre?
OriginalL'auteur bdonlan
Tout d'abord travailler sur les algorithme pour faire ce que vous devez faire. Exprimer de la pseudo-code ou C ou de la plaine de l'anglais ou de diagrammes ou de ce que vous êtes à l'aise avec. Une fois que vous avez effacé de cette conceptuel de l'obstacle à la mise en œuvre effective devrait être assez simple.
Votre CPU a probablement des instructions qui vous permettent de changement et/ou de faire pivoter un registre, peut-être, y compris le drapeau de portage comme un bit supplémentaire. Ces instructions seront très utiles.
OriginalL'auteur Paul R
Lorsque vous faites un décalage à droite, ce qui est le bit le moins significatif va dans le porte drapeau.
Lorsque vous effectuez une rotation, le porte drapeau est utilisé pour remplir libérés des bits de la suite (LSB pour un ROL, MSB pour un ROR).
OriginalL'auteur Jerry Coffin
Par exemple, si vous avez dans al le nombre d'octet le plus simple est
nous mettre 8 dans ecx pour la boucle
En bl nous havee la suite, nous ferons ebx, seulement pour voir ce qui se passe de mieux
Dans les bagages de drapeau maintenant, vous avez le dernier bit de gauche
vous pouvez maintenant ajouter de bl de ce que vous avez à transporter
et c'est tout
OriginalL'auteur Adi Bârsan
C'était un commentaire, mais j'ai pensé WTH!
Pour économiser de l'espace sur les 256 octets de la table, vous pouvez avoir un 16 octets du tableau contenant les valeurs pour les quatre bits (amuse-gueules) à la fois. L'algorithme serait alors
Si j'étais prof, j'aimerais certainement les deux parties où un changement est dans l'indexation et l'autre à l'extérieur.
OriginalL'auteur Olof Forshell
J'ai eu également le programme de cette bits inverse pour l'université (pour 8 bits). Voici comment j'ai fait:
Je n'ai pas commenté il donc, voici comment il fonctionne:
DH est un
1
qui se déplace dans l'octet comme la première fois:00000001
; deuxième temps00000010
et ainsi de suite. Lorsque vous faites uneAND
avec AL que vous obtenez0
ou quelque chose comme100
ou10000
vous devez décaler vers la droite de l'avoir comme0
ou1
.Ensuite, mettre en BH et le passage à la position désirée qui est
7
pour octet0
,6
pour octet1
et ainsi de suite. PuisOR
à notre résultat final etINC
etDEC
ce qui est nécessaire. Ne pas oublier la condition des sauts et de la popAX
pour la prochaine boucle 🙂Résultat sera au CH.
OriginalL'auteur Laurent Meyer