我需要像固定表一样手动指定每个布尔值,所以使用 数组:.skip 400
我将声明一个400字节的数组,那么如何设置布尔值?
答案 0 :(得分:0)
C和C ++中的布尔变量基本上被视为一个本机整数,为true分配1,为false分配0;在ARM的情况下,它将是一个32位整数。因此,如果您需要在C / C ++中以Booleans
数组的形式访问该结构,则需要将它们作为在4字节边界上对齐的32位整数进行访问。但是,如果您只需要从其他汇编代码访问它,您可以使用每个字节作为其自己的boolean
变量,并简单地在字节级别操作该数组。
在ARM程序集中,这将是使用LDR
与LDRB
访问数组之间的区别。
答案 1 :(得分:0)
ARM寄存器各为32位。你只需要一点来表示一个布尔值。所以你可以使用以下' C'用于访问数组的代码,
const values = document.querySelector('input.foo').value.split(';');
const [firstValue, ...rest] = values;
const lastValue = rest.slice(-1);
使用编译器定位您的CPU;例如,在Cortex-A5上调整godbolt输出,
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;
}
如果选择宏而不是函数调用(在编译/汇编时已知位编码),则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上可能更好。大多数ARM CPU都有32位总线,因此ldrb
和ldrb
的周期相等。