I jede Boolesche manuell wie in einem festen Tisch angeben muß, so Array: 400Wie erstellt man ein Boolesches Array in der Armmontage?
.skip I wird eine Reihe von 400 Bytes werden zu erklären, so Wie kann ich die Boolesche Werte?
I jede Boolesche manuell wie in einem festen Tisch angeben muß, so Array: 400Wie erstellt man ein Boolesches Array in der Armmontage?
.skip I wird eine Reihe von 400 Bytes werden zu erklären, so Wie kann ich die Boolesche Werte?
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
.
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.