Mehrdimensionale Arrays in Assembler
Hallo Alle
Kann irgend jemand plz mir sagen, wie Sie zu behandeln 2d-arrays in 8086 Assembler.
ich bin beginer in die Assembler-Programmierung.
Dank
- "Dann werden Sie sehen, dass es ist nicht der Speicher, der sich beugt, ist es nur sich selbst."
Du musst angemeldet sein, um einen Kommentar abzugeben.
Madhur link ziemlich bedeckt, hast du gelesen, dass durch?
wenn Sie bereits wissen, ein 2d-array an die C-Programmierung Ebene zum Beispiel dann der assembler ist der nächste logische Schritt.
Verwendung von 8-bit-bytes zum Beispiel ein array z[1][2] die zweite Zeile Dritte Element über, wenn Sie wollen, zu denken, dass es der Weg, der zum berechnen der Adresse, es ist wie es ist in C die Adresse von z plus die ersten index-fache Breite des Arrays, können sagen, es ist 13 Byte breit ist, plus der zweite index, also &z + (13*1)+2 = &z+15;
Mit pseudo-code und nicht x86-code (in diesem Fall ist Hausaufgaben).
wenn Sie hatte Schleifen in C
Die Umstellung auf assembler ist ziemlich straight-forward.
Brute-force wird immer für jede Plattform, brute-force-als-Basis-Adresse + (Breite mal der erste index) + (zweiter index mal die Größe des Elements). Optimierungen sehr stark auf, was Sie versuchen zu tun, in der ersten Versammlung Beispiele ich habe zum Beispiel, ist es dumm sich zu vermehren, indem man-wenn der erste index ist eine Feste, und/oder albern zu bewegen #2 zu registrieren, wenn, das ist eine harte Nummer, fügen Sie einfach 2. Wenn computing eine Zeit vs eine Schleife ändert sich die optimale Anzahl von Registern zu nutzen, usw. wenn Ihre Plattform nicht über eine Multiplikation oder es schmerzhaft ist, dann machen Sie Ihre arrays Befugnisse von zwei, wenn möglich eine gute Idee, um loszuwerden, die vermehren sich, oder andere tricks, um loszuwerden, wenn Sie das multiplizieren, wenn Sie können nicht ändern die Breite-und Ihre Plattform nicht zu haben oder macht vermehrt schmerzhaft.
Plattformen, die irgendeine Art von register offset-Adressierung [r0,r1], wo die Adresse ist die Summe der zwei Register, zum Beispiel, speichert Sie einen add und verhindert die Zerstörung der base-Adresse registrieren, so dass Sie es wieder verwenden können in einer Schleife. Wenn Sie gehen wollen-Zeiger-Stil mit einem zu zerstören, wie Sie gehen-Zeiger (*ptr++), das könnte sich ändern, wie Sie bei der Umsetzung Ihrer Schleifen, einige Plattformen erlauben die Verwendung einer base registrieren und fügen Sie einen Wert zu, zum Beispiel [r0],#16 würde die Adresse in r0 dann nach mit r0 add 16 r0, so dass Sie nicht haben, brennen Sie eine zusätzliche add-Anweisung...ich glaube nicht, dass x86, aber es hat andere Funktionen, die Sie verwenden können, für diese Aufgabe.
Beginnen Sie mit brute-force, als x86, das heißt, Sie sind wahrscheinlich zu haben, um mit Speicher zu halten loop-Variablen, wie Sie wahrscheinlich nicht genug Register für die Aufgabe (das ist okay, weil x86-viel Speicher-basierte Anweisungen), dann optimieren Sie die Einnahme Vorteil von load-und store-Variationen.