Ein Programm zu schreiben, berechnen Sie die Fakultät einer ganzen Zahl, in ARM-Assembler
Gegeben eine ganze Zahl muss ich eine Funktion schreiben, gibt die Fakultät Wert.
Hier ist mein code für die Fakultät-Funktion:
bl getnum
move r3, r0
mov r1, #1 -- counter
mov r4, r0
loop:
sub r0, r0, #1
mul r3, r0, r3
add r1, r1, #1
subs r1, r4 -- check if counter = the initial r0
beg loop
mov r0, r3
bl printnum
Dieser code jedoch ergibt Falsches Ergebnis. Wenn ich zum Beispiel den Eingang 5 gibt es 20 statt 120. Kann mir jemand helfen herauszufinden, wo die Dinge schief gehen? Meine logische Argumentation scheint zu funktionieren, aber ich weiß nicht, ob ich einen syntax-Fehler, der bewirkt, dass das Programm in einer anderen Weise
- Beim posten von code, den Sie kopieren und einfügen anstatt die Eingabe, um Tippfehler zu vermeiden. Ich bezweifle, dass Ihr code hat eine
beg
in es.
Du musst angemeldet sein, um einen Kommentar abzugeben.
sub
schreibt wieder das Ergebnis der Subtraktion des Ziel-Operanden. Das ist nicht, was Sie hier wollen - Sie wollen einfach nur zu tun, ein Vergleich, so dass Sie verwenden solltencmp
:Jedoch der code nicht den Fall behandeln, wo
n
ist 0 oder 1. Auch, es ist irgendwie unnötig, einen zusätzlichen Zähler (r1
), wenn Sie bereits eine perfekt passende Theke inr0
. So könnte man umschreiben, dass es in etwas so:IT
lernen, auch wenn der assembler gibt es automatisch), und überhaupt nicht verfügbar, in AArch64. Für Thumb2, ich denke, eincbz r0, after_loop
vor der Schleife würde die gleiche Summe code-Größe, aber weniger innerhalb der Schleife.Bitte Lesen Sie diese wunderbare post.
Als eine Randnotiz, bewusst sein, dass Ihr nicht den ARM aufrufen übereinkommen von ARM, um die ordnungsgemäße Kontextwechsel.
Ich denke, dass Sie zu viele Register, zu reduzieren versuchen, Ihre Zahl. Wäre einfacher, verfolgen Sie Ihre code flow und Debuggen.
Hier ist meine Letzte Anregung:
Ich denke, dass in Ihrer Lösung sollten Sie ändern
in
So dass Sie überprüfen, ob
r1 > r4
ohne änderungr1
, sonst verlassen Sie nach einer Schleife.