Carry-Flag
-
Hallo liebe Community,
ich stehe derzeit vor dem Problem dass ich einen Algorithmus für einen Microcontroller anpassen muss welcher 64 Bit Datentypen verwendet, vom Controller werden jedoch nur 32 Bit Datentypen unterstützt. Darum habe ich viele Anpassungen vorgenommen welche die Daten in einen Low und einen High-Byte unterteilt. Jedoch kommen auch einige arithmetische Operationen vor, und ich habe momentan keine Ahnung wie ich die Probleme meistern kann.
Prinzipiell steht auf einer CPU ja das Carry-Flag zur Verfügung, wie kann ich dieses unter C auslesen? Muss ich dazu auf Inline-Assembler zurückgreifen und dies für jede Architektur anpassen, oder gibt es da doch eine Libary?
Eine Addition eines 64 Bit Datentyps lässt sich mit a_low=b_low+c_low; if(a_low <b_low)a_high++; recht einfach umgehen so habe ich bei der Substraktion noch keine Lösung für das Problem gefunden. Darum werde ich wohl auf das Carry-Flag zurückgreifen müssen?
Desweiteren werde ich Bit-Shifts benötigen welche original über den 64 Bit Typ gehen, wie ich das anstelle weiß ich noch gar nicht, aber ich habe mir dazu noch keine all zu großen Gedanken gemacht.
lg
Martin
-
Das Carry-Flag kannst du so direkt nicht auslesen, mit inline-ASM würde das funktionieren. Das Problem bei der Subtraktion sehe ich nicht. Eine Subtraktion ist lediglich eine Addition mit umgedrehtem Vorzeichen.
-
baumgartner schrieb:
Eine Addition eines 64 Bit Datentyps lässt sich mit a_low=b_low+c_low; if(a_low <b_low)a_high++; recht einfach umgehen so habe ich bei der Substraktion noch keine Lösung für das Problem gefunden. Darum werde ich wohl auf das Carry-Flag zurückgreifen müssen?
Ist das bei der Subtraktion nicht noch viel naheliegender?
a_low=b_low-c_low; if(b_low <c_low)a_high--;
-
Danke für die Antworten, der Denkanstoß von PI hat da schon genug geholfen um den Knopf zu lösen.
Ich habe jetzt noch das Problem dass ich eine Multiplikation lösen muss. Meine Überlegung geht dahin statt der Multiplikation selbst-Additionen durchzuführen und bei jedem Schritt nach einem Überlauf zu prüfen.
Fällt euch evtl. eine performantere Methode ein das Problem zu lösen?
-
Ich möchte euch meine aktuelle Lösung natürlich nicht vorenthalten, getestet mit einigen Werten zw. 1 und 10k, wobei in der Praxis nur eine Multiplikation mit höchstens 9 durchgeführt wird.
tmp = b_low; tmp2 = b_high; for(int i = 1; i < mul; i++) { b_low += tmp; if(tmp > b_low) b_high++; b_high += tmp2; }