如何在手臂组装中创建一组布尔值?

时间:2017-06-19 23:48:35

标签: gcc arm armv7

我需要像固定表一样手动指定每个布尔值,所以使用 数组:.skip 400

我将声明一个400字节的数组,那么如何设置布尔值?

2 个答案:

答案 0 :(得分:0)

C和C ++中的布尔变量基本上被视为一个本机整数,为true分配1,为false分配0;在ARM的情况下,它将是一个32位整数。因此,如果您需要在C / C ++中以Booleans数组的形式访问该结构,则需要将它们作为在4字节边界上对齐的32位整数进行访问。但是,如果您只需要从其他汇编代码访问它,您可以使用每个字节作为其自己的boolean变量,并简单地在字节级别操作该数组。

在ARM程序集中,这将是使用LDRLDRB访问数组之间的区别。

答案 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位总线,因此ldrbldrb的周期相等。