Rizin
unix-like reverse engineering framework and cli tools
asm_sh.c
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2010-2011 eloi <limited-entropy.com>
2 // SPDX-FileCopyrightText: 2022 Dhruv Maroo <dhruvmaru007@gmail.com>
3 // SPDX-License-Identifier: LGPL-3.0-only
4 
5 #include <rz_lib.h>
6 #include <rz_util.h>
7 #include <rz_asm.h>
8 #include "../arch/sh/disassembler.h"
9 #include "../arch/sh/assembler.h"
10 
11 static int disassemble(RzAsm *a, RzAsmOp *op, const ut8 *buf, int len) {
12  SHOp *dis_op = sh_disassembler(rz_read_ble16(buf, a->big_endian));
13  op->size = 2;
14  if (!dis_op) {
15  rz_strbuf_set(&op->buf_asm, "invalid");
16  } else {
17  char *disasm = sh_op_to_str(dis_op, a->pc);
18  rz_strbuf_set(&op->buf_asm, disasm);
19  free(disasm);
20  }
21  RZ_FREE(dis_op);
22  return op->size;
23 }
24 
25 static int assemble(RzAsm *a, RzAsmOp *ao, const char *str) {
26  bool success;
27  ut16 opcode = sh_assembler(str, a->pc, &success);
28  if (!success) {
29  return -1;
30  }
31 
32  ut8 buffer[2];
33  rz_write_ble16(buffer, opcode, a->big_endian);
34  rz_strbuf_setbin(&ao->buf, buffer, 2);
35  return 2;
36 }
37 
39  .name = "sh",
40  .arch = "sh",
41  .author = "DMaroo",
42  .license = "LGPL3",
43  .bits = 32,
45  .desc = "SuperH-4 CPU",
46  .disassemble = &disassemble,
47  .assemble = &assemble
48 };
49 
50 #ifndef RZ_PLUGIN_INCORE
53  .data = &rz_asm_plugin_sh,
55 };
56 #endif
size_t len
Definition: 6502dis.c:15
RzAsmPlugin rz_asm_plugin_sh
Definition: asm_sh.c:38
static int assemble(RzAsm *a, RzAsmOp *ao, const char *str)
Definition: asm_sh.c:25
RZ_API RzLibStruct rizin_plugin
Definition: asm_sh.c:51
static int disassemble(RzAsm *a, RzAsmOp *op, const ut8 *buf, int len)
Definition: asm_sh.c:11
#define RZ_API
uint16_t ut16
RZ_API void Ht_() free(HtName_(Ht) *ht)
Definition: ht_inc.c:130
voidpf void * buf
Definition: ioapi.h:138
uint8_t ut8
Definition: lh5801.h:11
static ut16 rz_read_ble16(const void *src, bool big_endian)
Definition: rz_endian.h:493
static void rz_write_ble16(void *dest, ut16 val, bool big_endian)
Definition: rz_endian.h:532
@ RZ_LIB_TYPE_ASM
Definition: rz_lib.h:72
RZ_API const char * rz_strbuf_set(RzStrBuf *sb, const char *s)
Definition: strbuf.c:153
RZ_API bool rz_strbuf_setbin(RzStrBuf *sb, const ut8 *s, size_t len)
Definition: strbuf.c:85
#define RZ_SYS_ENDIAN_BIG
Definition: rz_types.h:527
#define RZ_SYS_ENDIAN_LITTLE
Definition: rz_types.h:526
#define RZ_FREE(x)
Definition: rz_types.h:369
#define RZ_VERSION
Definition: rz_version.h:8
RZ_IPI ut16 sh_assembler(RZ_NONNULL const char *buffer, ut64 pc, RZ_NULLABLE bool *success)
Assemble instruction from SuperH-4 ISA FPU instructions not implemented yet.
Definition: assembler.c:402
RZ_IPI RZ_OWN SHOp * sh_disassembler(ut16 opcode)
Disassemble opcode and return a SHOp.
Definition: disassembler.c:130
RZ_IPI RZ_OWN char * sh_op_to_str(RZ_NONNULL const SHOp *op, ut64 pc)
Return string representation of disassembled op.
Definition: disassembler.c:224
#define a(i)
Definition: sha256.c:41
Definition: buffer.h:15
RzStrBuf buf
Definition: rz_asm.h:71
const char * name
Definition: rz_asm.h:130
const char * version
Definition: rz_asm.h:133
Definition: dis.c:32