2016-12-05 3 views
0

Also lerne ich Assembly und ich habe ein Programm geschrieben, um Werte zu summieren, die ich in 'data_type' definiere.Assembly Anfänger: Legen Sie eine Variable gleich der Anzahl der Werte in DCD?

Atm Ich muss die Variable 'num' manuell auf die Anzahl der Werte in 'data_type' setzen, um sicherzustellen, dass die Schleife sie alle summiert.

Ich fragte mich, ob es eine bessere Möglichkeit gibt, dies zu tun?

Oder gibt es eine Möglichkeit, die Variable 'num' dynamisch zu deklarieren, um die Anzahl der Werte in 'data_type' zu übernehmen?

Vielen Dank im Voraus!

AREA Sum loop, CODE, READONLY 
ENTRY 
num EQU 5 
Reset_Handler 
LDR r1, =data_values 
MOV r5,#num  
loop 
LDR r2,[r1],#4 
ADD r3,r3,r2 
SUBS r5,r5,#1  
BNE loop 

data_values 
ALIGN 4 
DCD 1, 1, 1, 1, 1 ; example values 
END 
+1

Nicht sicher über Ihren Assembler, aber: 1) Was würde passieren, wenn 'data_values' nicht ausgerichtet ist? Wenn es auf ähnliche Weise wie andere Assembler funktioniert, hat das Symbol "data_values" den nicht ausgerichteten Adresswert, während das "DCD" Daten auf der ausgerichteten Adresse definiert, so dass Ihr Code unausgerichteten Zugriff auf falsche Datenbytes ausführt. Ich glaube, du solltest diese beiden tauschen, zuerst ausrichten und dann das symbolische Etikett definieren. 2) Was passiert nach 'BNE'? Oder führen Sie das im Debugger bis zu diesem Punkt aus und lassen Sie es niemals außerhalb des definierten Codes laufen? – Ped7g

+0

Okay danke, werde sie jetzt tauschen. Keil-Werkzeuge verwenden. Ich führe es nur mit einem Debugger zu BNE, da es nur eine Lernübung ist, haben Sie irgendwelche Empfehlungen, wie Sie das erreichen können, wonach ich gefragt habe? – ohkneel

Antwort

1

Ich habe mich gefragt, ob es einen besseren Weg, dies zu tun?

Meinung basiert ... und zu breit. Es gibt viele Möglichkeiten, wie Sie Ihre Daten strukturieren können. Jede dieser Daten kann für Sie in unterschiedlichen Situationen geeignet sein. Ich werde versuchen, alle wichtigen aufzulisten (ich wette, ich werde einige vergessen).

Compile Zeit:

  • was hast du
  • nicht nur Etikett am Anfang der Daten zu definieren, sondern auch am Ende der Daten, dann aus deren Differenz Sie Länge in Bytes berechnet werden kann (wenn Assembler ‚doesn t Basic Expression unterstützen, kann dies Laufzeitberechnung erfordern).
  • Viele Assembler unterstützen grundlegende Ausdrücke, wo Sie anstelle der Endbezeichnung tatsächlich etwas wie num equ (($ - start_label)/4) tun können, wobei $ aktuelle Adresse in einigen Assembler ist (wahrscheinlich nicht mit Ihren, das ist x86 TASM/MASM Beispiel).
  • Element und Array-Größe ist vollständig für immer fixiert (dh. "Satz von 15 Strings, jeweils 5 Zeichen lang" => 75 Bytes genau und Code geschrieben, nur um das zu unterstützen - wahrscheinlich nicht sehr brauchbar in der realen Welt, mit Ausnahme einiger hw- begrenzte Ecke Fällen .. oder schnelle Mash-up von Lernübungen mit Fokus auf etwas anderes, wo feste Array ist nicht wichtig).

Laufzeit:

  • Code schreiben in einer solchen Art und Weise, dass Anrufer der Funktion darf nicht nur Adresse des Arrays unterstützen, sondern auch Größe ist es (sehr vielseitig API Stil, können Sie in der Regel beugen andere Struktur Daten, die von einer solchen API verarbeitet werden sollen, obwohl bei Arrays mit Werterminierung diese nicht optimal effizient sein kann, da zuerst die Größe berechnet werden muss - dies delegiert das Problem der Struktur an den Aufrufer, löst es nicht alleine.
  • verwenden Sie einen Wert als Terminator, wie ASCII Z Strings Ende mit Wert 0.
  • Verwenden Sie einige Struktur von Daten, wie C++ std::vector, wo die interne Datenstruktur nicht nur Zeiger auf Speicher enthält, sondern auch separate Variable zu speichern Größe des Vektors (plus mehrere andere Variablen um Kapazität des zugewiesenen Speichers und Größe der letzten Zuordnung zu halten usw. Überprüfen Sie eine beliebige std::vector Implementierung, um in Ihren Fall gehen Sie zum Beispiel für die einfachste DCD 5, 1, 1, 1, 1, 1 (erstes Wort ist Größe, dann Daten folgen).
  • alles andere, was Sie sich vorstellen können ..Einige Beispiele der realen Welt sind verschiedene verschachtelte Strukturen, wie getrennte Bitebenen in alten EGA 16-Farbgraphiemodi, in denen eine Speicherbank ein Bit pro Pixel speicherte, und um ein einzelnes Pixel zu zeichnen, musste man durch alle vier Speicherbänke schalten Schreiben in jeden einzelnen Bitwert. Sie können so ziemlich alles erstellen, was Sie ausreichend mathematisch definieren und Code dafür schreiben können.
Verwandte Themen