Assemblée mod algorithme sur le processeur sans opérateur de division
J'ai besoin de mettre en œuvre une macro simple qui trouve le modulo de deux numéros sur un processeur qui n'est pas un opérateur de division (pensez à BRAS). Je pourrais utiliser la division par soustraction répétée, mais je ne sais pas si c'était la plus efficace ou la plus facile de travailler avec.
Des suggestions? Code serait encore plus utile. Cette classe particulière nous a l'aide d'un sous-ensemble de SPARC, de sorte que la plupart des opérations ressembler à ceci: add r1, r2, rdest
.
Cette mission en particulier appels pour vérifier que a mod b == 0
ou que le reste de la division est égal à zéro. Donc tous conseils ou de suggestions sur la mise en œuvre efficace serait la bienvenue.
- +1 pour l'auto-étiquetage devoirs, quelque chose que je n'ai pas vu arriver très souvent si loin.
Vous devez vous connecter pour publier un commentaire.
Aucune idée de ce exact des opérations, vous êtes limité à, mais je pense que vous feriez division longue, quelque chose comme cela, en pseudo-code:
Réellement calculer le quotient (ou au moins de sa valeur absolue), la dernière partie serait quelque chose comme:
Rien de tout cela est testé, et c'est probablement truffée d'erreurs.
Je pense à deux approches possibles. Parce que c'est les devoirs, je vais juste mentionner et vous permettent de travailler si elles sont réalisables et comment les mettre en œuvre:
A/B = 2^(log2(A)-log2(b)): Si vous pouvez obtenir le logarithme des valeurs, vous pouvez rapproche de la division.
Binaire Division Longue: Vous avez appris à faire décimal division longue avant que vous pourriez faire de la division de la, droite? Donc, enseignez à votre ordinateur pour faire de la binaire division longue (il devrait en fait être plus facile en binaire).
(edit: corrigé #1., le journal de la division de l'équation)
Cela ne veut pas répondre directement à votre question, mais est un cas intéressant néanmoins. Si le nombre est modulo avais par une puissance de deux, l'opération peut être effectuée que
Qui utilise une seule ET opération, qui généralement est un un ou deux cycle de fonctionnement.
Plus d'informations Sur Wikipedia
Semble que la soustraction (ou en ajoutant si a est négatif) par b jusqu'à ce que vous frappez ou de la croix-0 serait une mise en œuvre simple mais presque certainement pas le plus efficace.
Jweede, je n'avais aucune idée de comment le résoudre votre problème, mais j'ai trouvé un semblant pertinents post ici.
A/B=Q, donc A=B*q: Nous savons que les deux A & B, nous voulons Q.
Mon idée à ajouter au mélange:
Recherche binaire Q. Commencer avec Q=0 & Q=1, peut-être que la base de cas. Continuez à doubler jusqu'à ce que B * Q > A, et puis vous avez deux bornes (Q et Q/2), afin de trouver la bonne Q entre les deux de ces. O(log(A/B)), mais un peu plus compliqué à mettre en œuvre:
En outre, vous pouvez également faire une itération sur les bits, le réglage de chacun à 1. Si B * Q <= A est vrai, conserver le peu que 1, sinon zéro il. Procéder MSB->LSB. (Vous aurez besoin pour être en mesure de détecter B*Q débordement, cependant.
Merci pour les conseils tout!
J'ai commencé à l'aide d'une simple division par soustraction répétée de l'algorithme à mettre en œuvre. Mais comme l'a souligné ysth, il y a un moyen beaucoup plus facile. Voici le premier algorithme:
Cela ressemble à:
mod peut être calculée peu à peu:
Qui vous donne le reste, q serait le quotient.
Si vous avez bsrl les instructions, vous pouvez définir un mieux élevé lié pour moi, étant donné que vous pouvez commencer à le bit le plus significatif seulement.