2013-07-19 5 views
2

Comment calculer l'indicateur d'emprunt en soustrayant deux nombres de 8 bits?Comment mettre en œuvre l'indicateur d'emprunt dans C

J'ai trouvé cette description de drapeau d'emprunt mais je n'arrive toujours pas à comprendre comment faire?

Le report (retenue) flag est également réglée si la soustraction de deux nombres écessite une retenue dans les plus significatives (les plus à gauche) bits soustraits.

Je pense que j'ai besoin d'une doublure. Parce que calculer en utilisant la boucle est un gros goulot d'étranglement. Serait agréable de voir comment fonctionne le drapeau d'emprunt.

Merci.

+0

Vous n'avez pas besoin d'une boucle. La phrase clé est "bits les plus significatifs", pas tous les bits. – lurker

Répondre

3

a - b est exactement équivalent à a + (-b), et en effet, c'est ainsi que cela est souvent calculé en matériel. Par conséquent, le drapeau emprunte est vraiment équivalent à .

Dans votre cas, la valeur du drapeau de report est équivalente à la valeur du 9e bit de votre résultat.

+0

Donc, si j'implémente un émulateur, je dois simplement mettre en œuvre la gestion des drapeaux? Même avec l'instruction SUB? – kesrut

+0

Oui, c'est correct –

+0

Ce n'est pas vraiment correct, parce que si vous calculez 1 - 1 alors selon la réponse, il devrait être le même que 1 + (-1) = 1 + not (1) + 1 et si vous calculez la dernière expression (en binaire) vous verrez que l'ensemble de drapeau de report (16 bits pour les mots), mais en réalité ce n'est pas le cas. Donc 1 - 1! = 1 + (-1). Vous devriez en réalité calculer 1 - 1. Vous pouvez le vérifier en utilisant le code suivant dans x86: mov eax, 1; sub eax, 1 -> porter non défini. mov eax, 1; add eax, -1 -> carry set – Alexei

4

Si vous soustrayez x - y, les emprunts (carry-in) se produit lorsque y > x avec les deux y et x considérés comme des quantités non signés. Par conséquent, vous devez être bien avec le code C:

b = (unsigned)y > (unsigned)x; 

Si vous voulez que la façon dont un processeur calculerait fait cela, alors

x7 = x >> 7; 
y7 = y >> 7; 
r7 = (x - y) >> 7; 
b = (~x7 & y7) | (y7 & r7) | (r7 & ~x7); 

table de vérité est ici pour les numéros 2 bits:

x  y  r b 
00 00 00 0 
00 01 11 1 
00 10 10 1 
00 11 01 1 
01 00 01 0 
01 01 00 0 
01 10 11 1 
01 11 10 1 
10 00 10 0 
10 01 01 0 
10 10 00 0 
10 11 11 1 
11 00 11 0 
11 01 10 0 
11 10 01 0 
11 11 00 0 

Vous pouvez consulter par exemple l'instruction SBA au the HC12 Reference. Ceci utilise exactement l'expression pour b donnée ci-dessus.

+0

Donc, vous obtenez tous les bits les plus significatifs. Pouvez-vous expliquer toutes les variantes, puis vous définissez drapeau d'emprunt. Il m'est difficile de comprendre la dernière expression logique. – kesrut

+0

Peut-être que vous voulez dire (~ x7 & y7) | (y7 & r7) | (~ y7 & x7);? – kesrut

+0

J'ai ajouté quelques détails et une référence J'espère que cela aide Intuition n'est pas un bon guide ici.Cette définition est ce dont vous avez besoin pour une instruction "soustraire avec emprunt" pour travailler pour des opérations de 16 bits et plus avec le registre large de 8 bits. – Gene

Questions connexes