2017-06-19 7 views

答えて

0

CおよびC++のブール変数は、基本的にtrueの場合は1、falseの場合は0に割り当てられたネイティブ整数として扱われます。 ARMの場合、それは32の整数です。したがって、C/C++でブーリアンの配列として構造体にアクセスする必要がある場合は、4バイト境界に整列した32ビットの整数としてアクセスする必要があります。ただし、他のアセンブリコードからアクセスする必要がある場合は、各バイトを独自の「ブール型」変数として使用し、単純にバイトレベルで配列を操作できます。

アセンブリでは、これはLDRLDRBの配列をアクセスすることの違いになります。

0

ARMレジスタはそれぞれ32ビットです。ブール値を表現するには少ししか必要ありません。したがって、次の 'C'コードを使用して配列にアクセスできます。

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; 
} 

コンパイラを使用してCPUをターゲットに設定します。 Cortex-A5にgodbolt出力を調整する例えば

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 

命令を与えるtstbclrなどマクロの代わりに、関数呼び出し(コンパイル時に既知のビットインデックス/時間を組み立てる)を選択した場合に有用であるかもしれません。また、古いプラットフォーム/ CPUでは、ldrbまたはバイトアクセスが良いかもしれません。ほとんどのARM CPUは32ビットバスを持っているため、ldrbldrのサイクルは等しくなります。

関連する問題