2017-06-19 11 views

Antwort

0

Boolesche Variablen in C und C++ werden grundsätzlich als native Ganzzahl behandelt, die 1 für wahr und 0 für falsch zugewiesen wird; im Fall von ARM wäre es eine 32-Bit-Ganzzahl. Wenn Sie also in C/C++ auf die Struktur als Boolesches Array zugreifen müssen, müssen Sie auf sie als 32-Bit-Ganzzahlen zugreifen, die an einer 4-Byte-Grenze ausgerichtet sind. Wenn Sie jedoch nur von einem anderen Assembler-Code aus darauf zugreifen müssen, können Sie jedes Byte als eigene "boolesche" Variable verwenden und das Array einfach auf Byte-Ebene manipulieren.

In ARM einer Baugruppe wäre dies der Unterschied zwischen dem Zugriff auf das Array mit LDR vs mit LDRB.

0

ARM-Register sind jeweils 32 Bit. Sie benötigen nur ein bisschen, um einen booleschen Wert darzustellen. So können Sie den folgenden "C" -Code verwenden, um auf ein Array zuzugreifen,

uint32_t load_bool(uint32_t index) 
{ 
    return (bool_array[index>>2] & (1<<(index&3))); 
} 

void store_bool(uint32_t index, int value) 
{ 
    uint32_t target = bool_array[index>>2]; 
    if(value) 
    target |= (1<<(index&3)); 
    else 
    target &= ~(1<<(index&3)); 

    bool_array[index>>2] = target; 
} 

Verwenden Sie einen Compiler, um Ihre CPU anzusprechen; zum Beispiel godbolt Ausgabe auf einem Cortex-A5 Tuning gibt,

load_bool(unsigned int): 
     ldr  r3, =bool_array 
     mov  r2, r0, lsr #2 
     ldr  r3, [r3, r2, asl #2] 
     and  r0, r0, #3 
     mov  r2, #1 
     and  r0, r3, r2, asl r0 
     bx  lr 
store_bool(unsigned int, int): 
     ldr  r3, =bool_array 
     mov  r2, r0, lsr #2 
     cmp  r1, #0 
     ldr  r1, [r3, r2, asl #2] 
     and  r0, r0, #3 
     mov  ip, #1 
     orrne r0, r1, ip, asl r0 
     biceq r0, r1, ip, asl r0 
     str  r0, [r3, r2, asl #2] 
     bx  lr 

Die Anweisungen tst, bclr, etc könnte nützlich sein, wenn Sie einen Makro statt einen Funktionsaufruf (Bit-Index bekannt, bei der Kompilierung/zusammenbauen Zeit) wählen. Außerdem kann ldrb oder Byte-Zugriff auf älteren Plattformen/CPUs besser sein. Die meisten ARM-CPUs haben einen 32-Bit-Bus, so dass die Zyklen für ldrb und ldr gleich sind.

Verwandte Themen