Dies ist ein Hausaufgabenproblem, und ich habe letzte Nacht versucht, es zu lösen, aber ich bin immer noch ein Neuling in der Assemblersprache.
Gib mir nicht die vollständige Lösung, gib mir nur einen Hinweis.
Entwerfen Sie ein ARM Assembly Language-Programm, das einen in R1 gespeicherten 32-Bit-Wert untersucht und die Anzahl der zusammenhängenden Sequenzen von 1s zählt. Zum Beispiel
01110001000111101100011100011111
enthält der Wert: sechs Folgen von 1s.Schreiben Sie den Endwert in das Register R2.
Ich denke, der Algorithmus besteht darin, jedes Zeichen i
einzeln zu lesen und jedes Mal um 1 zu erhöhen, wenn es 2 fortlaufende Einsen gegenübersteht. Aber wie geht das in Assemblersprache?
Antworten:
Schreiben Sie eine Schleife, um das Wort nach links oder rechts zu verschieben (spielt keine Rolle), bis das Wort aus Nullen besteht. Das Übertragsflag gibt Ihnen den Wert des nächsten Bits an.
Wenn Carry ist
1
und der vorherige Carry Null war, starten Sie eine neue Sequenz von1
s. Setzen Sie dann ein Vorher-war-zuerst-eins-Flag. (Ich gehe davon aus, dass Sie mit zusammenhängend mindestens 2 meinen.)Wenn Carry eingestellt ist
1
und eingestelltprevious-was-a-first-one
ist, haben Sie eine zusammenhängende Reihe und erhöhen Ihren Zähler. Lösche dieprevious-was-a-first-one
Flagge.Wenn Carry
0
dann klar ist dasprevious-was-a-first-one
.bearbeiten
Anscheinend erfordert "zusammenhängend" nicht mehr als 1 Bit, und dann ist es noch einfacher:
quelle
Hier ist eine Lösung, die über die Anzahl der Zeichenfolgen und nicht über die Anzahl der Bits im Wort iteriert. Da ich mit der ARM-Assemblersprache nicht wirklich vertraut bin, gebe ich sie in C an. Da nur bitweise Operatoren verwendet werden, wird sie ziemlich direkt in Assembler-Code übersetzt.
quelle
Nur Vorschlag wie gefragt. Sie müssen durch jedes Bit verschieben, dies kann durch
shifting
die Nummer auf die erfolgenright
. Überprüfen Sie vor dem Verschieben den Wert des am weitesten rechts liegenden Bits. Dies kann durch die OperationAND
mit dem Kunden erreicht werden1
. Verwenden Sie eine gewisse Temperatur, um den zuletzt überprüften Wert zu speichern und einen Zähler an der "ansteigenden Flanke" zu erhöhen, dh wenn sich der vorherige Wert von 0 auf 1 im Pseudocode ändertquelle
Dies funktioniert, weil das Ergebnis des XOR in Schritt 3 an jedem Punkt, an dem es einen Übergang gab, ein Paar von Einsen aufweist. Wenn Sie also zählen, wie viele Einsen Sie haben, und durch 2 teilen, haben Sie, wie viele Übergänge es gab. Dies gibt Ihnen die Anzahl der Blöcke aufeinanderfolgender Werte.
Wenn X zu 0 führt, haben Sie entweder alle Einsen oder alle Nullen. Sie können also zunächst prüfen, ob der ursprüngliche Wert 0 ist, und in diesem Fall sofort mit Null zurückkehren, ohne die obigen Schritte auszuführen. Wenn dies nicht der Fall ist und X 0 ist, geben Sie 1 zurück. Wenn nicht, teilen Sie es erneut durch 2 (da die Anzahl der Blöcke mit 1 natürlich die Hälfte der Anzahl der verschiedenen Blöcke betragen muss).
quelle