Exemplo n.º 1
0
static bool gb_parse_ld1 (ut8 *buf, const int minlen, char *buf_asm) {
	int i;
	r_str_replace_in (buf_asm, strlen(buf_asm), ", ", ",", R_TRUE);
	if ((i = strlen(buf_asm)) < minlen)
		return false;
	r_str_do_until_token (str_op, buf_asm, '\0');
	if (buf_asm[4] == ',') {
		i = gb_reg_idx (buf_asm[3]);
		if (i == (-1))
			return false;
		buf[0] = (ut8)(0x40 + (i * 8));
		if ((i = gb_reg_idx (buf_asm[5])) == (-1))
			return false;
		buf[0] |= (ut8)i;
	} else if (buf_asm[3] == '['
		&& buf_asm[4] == 'h'
		&& buf_asm[5] == 'l'
		&& buf_asm[6] == ']'
		&& buf_asm[7] == ',') {
		if ((i = gb_reg_idx (buf_asm[8])) == (-1))
			return false;
		buf[0] = 0x70 | (ut8)i;
	}
	return true;
}
Exemplo n.º 2
0
static int gb_parse_arith1 (ut8 *buf, const int minlen, char *buf_asm, ut8 base, ut8 alt) {
	int i;
	ut64 num;
	if (strlen (buf_asm) < minlen)
		return 0;
	buf[0] = base;
	i = strlen (&buf_asm[minlen - 1]);
	r_str_replace_in (&buf_asm[minlen - 1], (ut32)i, "[ ", "[", R_TRUE);
	r_str_replace_in (&buf_asm[minlen - 1], (ut32)i, " ]", "]", R_TRUE);
	r_str_do_until_token (str_op, buf_asm, ' ');
	i = gb_reg_idx (buf_asm[minlen-1]);
	if (i != (-1))
		buf[0] |= (ut8)i;
	else if (buf_asm[minlen - 1] == '['
		&& buf_asm[minlen] == 'h'
		&& buf_asm[minlen + 1] == 'l'
		&& buf_asm[minlen + 2] == ']' )
		buf[0] |= 6;
	else {
		buf[0] = alt;
		num = r_num_get (NULL, &buf_asm[minlen - 1]);
		buf[1] = (ut8)(num & 0xff);
		return 2;
	}
	return 1;
}
Exemplo n.º 3
0
static bool gb_parse_ld2 (ut8 *buf, char *buf_asm) {
	int i;
	ut64 num;
	if (strlen (buf_asm) < 6)
		return false;
	if (buf_asm[4] == ',') {
		if ((i = gb_reg_idx (buf_asm[3])) == (-1))
			return false;
		buf[0] = 0x6 + (ut8)(i * 8);
		num = r_num_get (NULL, &buf_asm[5]);
		buf[1] = (ut8)(num & 0xff);
		return true;
	} else if (buf_asm[3] == '['
		&& buf_asm[4] == 'h'
		&& buf_asm[5] == 'l'
		&& buf_asm[6] == ']'
		&& buf_asm[7] == ','
		&& buf_asm[8] != '\0') {
		buf[0] = 0x36;
		num = r_num_get (NULL, &buf_asm[8]);
		buf[1] = (ut8)(num & 0xff);
		return true;
	}
	return false;
}
Exemplo n.º 4
0
static bool gb_parse_cb1 (ut8 *buf, const int minlen, char *buf_asm, ut8 base) {
	int i;
	if (strlen (buf_asm) < minlen)
		return false;
	buf[0] = base;
	i = strlen (&buf_asm[minlen - 1]);
	r_str_replace_in (&buf_asm[minlen - 1], (ut32)i, "[ ", "[", R_TRUE);
	r_str_replace_in (&buf_asm[minlen - 1], (ut32)i, " ]", "]", R_TRUE);
	r_str_do_until_token (str_op, buf_asm, ' ');
	i = gb_reg_idx (buf_asm[minlen-1]);
	if (i != (-1)) {
		buf[0] |= (ut8)i;
		return true;
	} else if (buf_asm[minlen - 1] == '['
		&& buf_asm[minlen] == 'h'
		&& buf_asm[minlen + 1] == 'l'
		&& buf_asm[minlen + 2] == ']' ) {
		buf[0] |= 6;
		return true;
	} else 	return false;
}
Exemplo n.º 5
0
static bool gb_parse_cb2 (ut8 *buf, const int minlen, char *buf_asm, ut8 base) {
	ut64 num;
	int i;
	char *p, *q;
	if ((i = strlen (buf_asm)) < minlen)
		return false;
	r_str_replace_in (buf_asm, (ut32)i, "[ ", "[", R_TRUE);
	r_str_replace_in (buf_asm, (ut32)i, " ]", "]", R_TRUE);
	r_str_replace_in (buf_asm, (ut32)i, ", ", ",", R_TRUE);
	p = strchr (buf_asm, (int)' ');
	if (!p) return false;
	q = strchr (p, (int)',');
	if (!q) return false;
	q[0] = '\0';
	if (p[1] == '\0' || q[1] == '\0') {
		q[0] = ',';
		return false;
	}
	num = r_num_get (NULL, &p[1]);
	q[0] = ',';
	if (num > 7)
		return false;
	buf[0] = base + (ut8)num * 8;
	i = gb_reg_idx (q[1]);
	if (i != (-1)) {
		buf[0] |= (ut8)i;
		return true;
	}
	if (strlen(&q[1]) < 4)
		return false;
	if (q[1] == '[' && q[2] == 'h'
			&& q[3] == 'l'
			&& q[4] == ']') {
		buf[0] |= 6;
		return true;
	}
	return false;
}