Iはそれぞれそう アレイを使用して、手動で固定テーブルのようにブール指定する必要があります400アームアセンブリにブール値の配列を作成するにはどうすればいいですか?
を.SKIP Iは、400バイトの配列を宣言されるので、どのようにしてブール値を設定することができますか?
Iはそれぞれそう アレイを使用して、手動で固定テーブルのようにブール指定する必要があります400アームアセンブリにブール値の配列を作成するにはどうすればいいですか?
を.SKIP Iは、400バイトの配列を宣言されるので、どのようにしてブール値を設定することができますか?
CおよびC++のブール変数は、基本的にtrueの場合は1、falseの場合は0に割り当てられたネイティブ整数として扱われます。 ARMの場合、それは32の整数です。したがって、C/C++でブーリアンの配列として構造体にアクセスする必要がある場合は、4バイト境界に整列した32ビットの整数としてアクセスする必要があります。ただし、他のアセンブリコードからアクセスする必要がある場合は、各バイトを独自の「ブール型」変数として使用し、単純にバイトレベルで配列を操作できます。
アセンブリでは、これはLDR
とLDRB
の配列をアクセスすることの違いになります。
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
命令を与えるtst
、bclr
などマクロの代わりに、関数呼び出し(コンパイル時に既知のビットインデックス/時間を組み立てる)を選択した場合に有用であるかもしれません。また、古いプラットフォーム/ CPUでは、ldrb
またはバイトアクセスが良いかもしれません。ほとんどのARM CPUは32ビットバスを持っているため、ldrb
とldr
のサイクルは等しくなります。