LDRB in ARM ASM - Allgemeine Fragen

Ich bin mit einer ARM-Architektur und ich bin ein wenig unklar das Konzept mit LDRB. LDRB als LDR-mit der optionalen B-Befehl, laden das am wenigsten signifikante byte der 32-bit-Wort. Drei Probleme.

  1. Was ich eigentlich will, ist die ersten 8 bits, nicht die letzten 8 bits (ich bin der Iteration über ein array). Gibt es einen eleganten Weg, dies zu tun? Ich konnte nicht finden, dass ein Befehl für ihn.
  2. Was ich gerade mache ist SUB r4, r4, #3 zu verschieben r4 (mein Zeiger, ich will Last) zurück, der drei bytes, so dass das niederwertigste byte wird nun der in der front des 32-bit-Wort. Ist dieser haftbar zu verursachen Speicher Probleme auftreten, wenn alles, was ich tun Iteration vorwärts?
  3. Ich bin mit LDRB r7, r4; dieser laden sollte das " least significant byte von r4 zu r7. Von null erweitern, es bedeutet genau das, was kommen wird so etwas wie 00...00010101, oder 10101000...00?
  • (Das heißt, die ARM-Dokumentation sagt, dass LDRB wird null verlängern. Es ist nicht angegeben, in welche Richtung.)
  • LDRB r7, r4 war nicht eine gültige Instruktion Letzte mal habe ich geprüft. Null-Erweiterung bedeutet, das füllen der N höchstwertigen bits mit Nullen.
  • Es ist ein bisschen unklar, wie die Daten, die Sie gerade Lesen, ist gelegt (z.B. warum müssen Sie subtrahieren Sie 3 von Zeigern). Wenn ein Zeiger zeigt auf den Anfang eines Worts (D. H. der Zeiger ist word-aligned), dann, wenn Sie LDRB aus, die Zeiger werden Sie Lesen das " least significant byte (auf einem little-endian-Maschine).
  • Ich bin mir nicht sicher, warum LDRB r7, r4 wäre ungültig; LDR hat einen optionalen Vorwort für B und erfordert eine Registrierung und eine zweite flexible Operanden. Warum würde das nicht funktionieren? Außerdem habe ich ein char array in C, dass ich zu Durchlaufen byte für byte zu überprüfen 00000000 byte (und speichern der Anzahl der Iterationen). Und da LDRB gibt mir das "least significant byte, ich brauche zum starten der Schleife drei bytes im Voraus, so dass das" least significant byte ist am Anfang des array (das höchstwertige byte).
  • Ah. Ofc. LDRB r7, [r4];.
  • Okay, neuer plan. LDRB r7, [r4, #-3], #1; Dadurch verschiebt sich die Last wieder 3 bytes, dann permanent bewegt r4 nach vorne, entfernen Sie alle müssen Durchlaufen Sie in einem separaten Befehl. Yay.
  • Zugegeben, ich habe nicht geschrieben, jeder ARM assembly in eine Weile, aber ich sehe nicht, wie LDRB r7,[r4, #-3], #1 funktionieren würde. Geben Sie entweder eine vor-Indexierung im offset-oder ein post-indexing-offset, nicht beide. Auch, wenn Ihre Daten einen string, es scheint mir, wie die einfachste Lösung wäre, nur initialisieren r4 um auf das erste Zeichen und dann das laden jedes Zeichen mit ldrb r7,[r4],#1 in einer Schleife. Die ldrb Anweisung implizit null-erweitert. Wenn man wollte Zeichen Erweiterung, die Sie hätten verwenden ldrsb.
  • Können Sie näher erläutern, was du meinst mit dem "ersten" - byte, das "Letzte" byte " und "move to front". Diese Begriffe haben keine wirkliche Bedeutung. Bitte ersetzen Sie die bit-zahlen (bits[7:0]) oder verwenden Sie Begriffe wie "least significant" und "wichtigsten".

InformationsquelleAutor J.Swersey | 2014-01-26
Schreibe einen Kommentar