#include "trap.h" typedef unsigned char uint8_t; __attribute__((noinline)) bool getbit(void *buf, int offset){ int byte = offset >> 3; offset &= 7; uint8_t mask = 1 << offset; return (((uint8_t *)buf)[byte] & mask) != 0; } __attribute__((noinline)) void setbit(void *buf, int offset, bool bit){ int byte = offset >> 3; offset &= 7; uint8_t mask = 1 << offset; uint8_t * volatile p = buf + byte; *p = (bit == 0 ? (*p & ~mask) : (*p | mask)); } int main() { uint8_t buf[2]; buf[0] = 0xaa; buf[1] = 0x0; nemu_assert(getbit(buf, 0) == 0); nemu_assert(getbit(buf, 1) == 1); nemu_assert(getbit(buf, 2) == 0); nemu_assert(getbit(buf, 3) == 1); nemu_assert(getbit(buf, 4) == 0); nemu_assert(getbit(buf, 5) == 1); nemu_assert(getbit(buf, 6) == 0); nemu_assert(getbit(buf, 7) == 1); setbit(buf, 8, 1); setbit(buf, 9, 0); setbit(buf, 10, 1); setbit(buf, 11, 0); setbit(buf, 12, 1); setbit(buf, 13, 0); setbit(buf, 14, 1); setbit(buf, 15, 0); nemu_assert(buf[1] == 0x55); return 0; }