static int assemble(RAsm *a, RAsmOp *op, const char *buf) { const bool is_thumb = (a->bits == 16); int opsize; ut32 opcode; if (a->bits == 64) { if (!arm64ass (buf, a->pc, &opcode)) { return -1; } } else { opcode = armass_assemble (buf, a->pc, is_thumb); if (a->bits != 32 && a->bits != 16) { eprintf ("Error: ARM assembler only supports 16 or 32 bits\n"); return -1; } } if (opcode == UT32_MAX) { return -1; } if (is_thumb) { const int o = opcode >> 16; opsize = o > 0? 4: 2; //(o&0x80 && ((o&0xe0)==0xe0))? 4: 2; if (opsize == 4) { if (a->big_endian) { r_write_le32 (op->buf, opcode); } else { r_write_be32 (op->buf, opcode); } } else if (opsize == 2) { r_write_be16 (op->buf, opcode & UT16_MAX); } } else {
R_API bool r_reg_set_value(RReg *reg, RRegItem *item, ut64 value) { int fits_in_arena; ut8 bytes[12]; ut8 *src = bytes; if (!item) { eprintf ("r_reg_set_value: item is NULL\n"); return false; } switch (item->size) { case 80: case 96: // long floating value r_reg_set_longdouble (reg, item, (long double)value); break; case 64: if (reg->big_endian) { r_write_be64 (src, value); } else { r_write_le64 (src, value); } break; case 32: if (reg->big_endian) { r_write_be32 (src, value); } else { r_write_le32 (src, value); } break; case 16: if (reg->big_endian) { r_write_be16 (src, value); } else { r_write_le16 (src, value); } break; case 8: r_write_ble8 (src, (ut8)(value & UT8_MAX)); break; case 1: if (value) { ut8 *buf = reg->regset[item->arena].arena->bytes + (item->offset / 8); int bit = (item->offset % 8); ut8 mask = (1 << bit); buf[0] = (buf[0] & (0xff ^ mask)) | mask; } else { int idx = item->offset / 8; RRegArena *arena = reg->regset[item->arena].arena; if (idx + item->size > arena->size) { eprintf ("RRegSetOverflow %d vs %d\n", idx + item->size, arena->size); return false; } ut8 *buf = arena->bytes + idx; int bit = item->offset % 8; ut8 mask = 0xff ^ (1 << bit); buf[0] = (buf[0] & mask) | 0; } return true; default: eprintf ("r_reg_set_value: Bit size %d not supported\n", item->size); return false; } fits_in_arena = (reg->regset[item->arena].arena->size - BITS2BYTES (item->offset) - BITS2BYTES (item->size)) >= 0; if (src && fits_in_arena) { r_mem_copybits (reg->regset[item->arena].arena->bytes + BITS2BYTES (item->offset), src, item->size); return true; } eprintf ("r_reg_set_value: Cannot set %s to 0x%" PFMT64x "\n", item->name, value); return false; }