Wie zu tun Spaltung in ARM?
Ich m versuchen, herauszufinden, wie eine Trennung in ARM, da es keine DIV
Befehl. Wenn das getan werden kann, durch Multiplikation der float-Zahl [/9 = *0.09]
durch Subtraktion oder durch die Nutzung einer Bibliothek. Jede Art und Weise tun würde.
Momentan mache ich division mit der Subtraktion mit einer Schleife wie diesem, aber ich lose die Nachkommastellen:
MOV R0,#70 ;Fahrenheit Temperature
SUB R1,R0,#32 ; Subtracting 32
MOV R4,#0 ;Counter
LOOP
ADD R4,R4,#1; Counter+1 ->Is the answer of the division without decimals
SUB R1,#9
CMP R1,#0
BPL LOOP
MOV R1,R4
Also im Grunde das, was ich Tue ist, dass ich die Temperatur auf 70, ich subtrahieren Sie 32 und ich bekomme 38. Dann in der Schleife nehme ich 9 jeder Zeit, bis die Erinnerung ist kleiner als 9. Die Antwort mit der normalen division ist 4.22222. Hier bekomme ich 5. Also mein Ergebnis ist nicht so genau.
- mögliche Duplikate von Schnell-Division auf GCC/ARM
- Besser ist es sich zu vermehren durch so etwas wie (2^16/9~=7282) und dann bei gedrückter Umschalttaste durch 2^16 auf das Ergebnis. Sie haben, um zu wissen, die Werte und das funktioniert nur für einen festen division.
- Andere Verwandte quesions: Integer division auf ARM, Montage-mod-Algorithmus, schauen Sie auf der zugehörigen Liste auf der Seite der Frage.
- Mein ARM hat eine Abteilung Anweisung...warum nicht deins? Ist es vielleicht ein wenig mehr Informationen könntest du uns geben?
- homepage.cs.uiowa.edu/~jones/bcd/divide.html und nur das tun, jede andere Zahl. ja, Sie können Feste oder float multiplizieren von 1/9. zum Beispiel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nur wollen, zu teilen ein integer-Wert in
r0
von 9 können Sie Ungefähre dass mit:r3
enthält nun den ganzzahligen Teil des Quotienten, undr9
enthält der gebrochene Teil skaliert von 2^32. Um den Rest würde man nur multiplizieren, der ganzzahlige Teil des Quotienten mit 9 und subtrahiere das Ergebnis von der ursprünglichen Wert.r3
(ganze Teil) undr9
(Nachkomma-Teil), der gleich(r0 << 32) / 9
.uint32_t
Eingänge siehe GCC8.2 Ausgabe: godbolt.org/z/-PVI_Q verwendet einen unterschiedlichen Multiplikator, den braucht ein rechts-shift um 1 nach umull, aber das ist alles.Michael ' s Antwort ist richtig, wenn Sie teilen Sie die Anzahl durch eine Konstante, und Sie müssen eine ganze Zahl als Ergebnis. Sie bekommen nicht den Bruchteil, wie Sie wollen.
Wenn du ein Fließkomma-Ergebnis benötigen Sie eine floating-point-division-Funktion, die ist nicht einfach zu implementieren in software und asm auf Architekturen ohne FPU. ARMv7 und höher haben FPU/SIMD standardmäßig einige ARMv6 und unten haben auch die FPU so können Sie unterteilen es direkt in hardware
Einer Festkomma-Lösung kann einfacher sein, nur teilen Sie die Anzahl, wie normale integer-division aber denken Sie daran, passen Sie das Ergebnis nach der Berechnung. Natürlich fixed-point-Zahl nicht haben, großen Dynamikbereich, wie floating-point-aber in deinem Fall denke ich, die Auswahl ist groß genug. Sie können auch multiplizieren Sie den Rest von 10n, mit
n
ist die Anzahl der Ziffern nach dem Dezimalzeichen, die Sie benötigen, dann teilen Sie es mit den oben genannten Teiler erneut, um die Bruch-TeilBeispielsweise, um das Ergebnis des 22/9 mit 3 Ziffern der Präzision gehen Sie wie folgt vor:
Erhalten Sie mehr Präzision, multiplizieren Sie einfach den Rest mit einer größeren Leistung von 10