⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 a64-2.c

📁 Intel x86处理器的汇编器
💻 C
📖 第 1 页 / 共 2 页
字号:
	while (p->mode && !str_cmp(s, p->mode))		p++;	return p->mode_id;}unsigned char get_bitsid(char *s){	bits_t *p = bits;	if (!s || !s[0])		return 0;	while (p->bits && !str_cmp(s, p->bits))		p++;	return p->bits_id;}/*************************************************************/int check_cast(unsigned char cast){	if (cast == NEAR_ID || cast == FAR_ID) {		/* it's transfer cast */	} else if (cast && (current_bits == 64)) {	} else if (!cast || cast == 64)		return 0;			return 1;}int check_oseg(unsigned char oseg){	if (oseg && (current_bits != 64)) { 		/* 32-bit */	} else if (!oseg || (oseg == 0x2e) || (oseg ==  0x3e) || 			(oseg == 0x26) || (oseg == 0x36))		/* in 64-bit mode: the CS,DS,ES and SS is invalid */		return 0;	return 1;}/***************************************** check register is GPR*****************************************//*int is_GPR(unsigned char regid){	return regid && ((regid & 0xf0) < 0xa0);}*/// #define is_GPR(regid)	((regid) && ((regid & 0xf0) < 0xa0))/*int is_eGPR(unsigned char regid){	return regid && ((regid & 0xf0) == 0x80);}*/// #define is_eGPR(regid)	((regid) && ((regid & 0xf0) == 0x80))int get_reg_size(unsigned char regid){	int reg_size = 0;	if (is_GPR(regid))		reg_size = (regid & 0xf0) >> 1;		else if ((regid & 0xf0) == 0xa0)	/* segment register */		reg_size = 16;	else if ((regid & 0xf0) == 0xc0)	/* control register */		reg_size = 16;	else if ((regid & 0xf0) == 0xd0)	/* debug register */		reg_size = 16;	else if ((regid & 0xf0) == 0xe0)	/* mmx register */		reg_size = 64;	else if ((regid & 0xf0) == 0xf0)	/* xmm register */		reg_size = 128;		return reg_size;}/************************************************** the funtion check base or index register***************************************************/int check_mreg(unsigned char regid){	if (!regid || ((regid & 0xF0) == 0x10))	/* 1-byte register */		return 0;	else if ((regid & 0xF0) >= 0xa0)	/* not GPR */		return 0;	else if ((regid & 0xF0) == 0x20) {	/* 2-byte register */		/* it's 16-bit address mode */		/* in 64-bit mode: not support 16-bit address */		if (current_bits == 64)			return 0;		/* in 32-bit mode: 16-bit address base register 		   only support bx, bp, si and di register */		else if (regid == BX || regid == BP || regid == SI 			|| regid == DI) {			/* at 32-bit or 16-bit... OK */		} else 			return 0;	} else if ((regid == ESP) || (regid == RSP)) {				/* 32-bit address or 64-bit address is OK */			}	return 1;}/********************************************************* check the string is var ????**********************************************************/int check_var(char *s){	return 1;}/************************************************************/kw_id_t get_keyword(char *s) {	 keyword_t *p = keyword;	if (!s) return 0;		while (p->keyword && !str_cmp(p->keyword, s)) 		p++;	return p->keyword_id;}long long strd_to_n(char *s) {	long long retval = 0;	while (*s)		retval = retval * 10 + (*s++ - '0');	return retval;}long long strh_to_n(char *s) {	long long retval = 0;	int i = 0;	s++;	if (*s == 'x' || *s == 'X') {		s++;		while (*s) {			if (is_n(*s))				i = *s - '0';			else if (is_hc(*s))				i = *s - 'a' + 10;			else				return 0;			retval = retval * 16 + i;			s++;		}	} else {		while (*s) {			if (*s == 'h' || *s == 'H')				break;			if (is_n(*s))				i = *s - '0';				else if (is_hc(*s))				i = *s - 'a' + 10;			else				return 0;			retval = retval * 16 + i;			s++;		}	}	return retval;}long long strb_to_n(char *s) {	long long retval = 0;	while (*s) {		if (*s == 'b' || *s == 'B')			break;		retval = retval * 2 + (*s - '0');		s++;	}	return retval;}long long str_to_n(char *s) {	long long retval = 0;	if (!s || !s[0]) return 0;	if (is_hex(s)) 		retval = strh_to_n(s);	else if (is_dec(s))		retval = strd_to_n(s);	else if (is_binary(s))		retval = strb_to_n(s);	else		return 0;	return retval;}/*********************************************************** *  i_key_t *get_i_key(char *s) *  return value: i_key if found *                  0   if no found************************************************************/i_key_t *get_ins(char *s){	if (!s || !s[0])		return 0;	i_set_t *p = i_set;		while (p->mnemonic && !str_cmp(s, p->mnemonic)) 		p++;	return p->i_key;}i_key_t *get_transfer_ins(char *s){	if (!s || !s[0])		return 0;	i_set_t *p = i_transfer;	while (p->mnemonic && !str_cmp(s, p->mnemonic))		p++;	return p->i_key;}int is_string_ins(i_key_t *ins_key){	if (ins_key == CMPSB) {	} else if (ins_key == CMPSW) {	} else if (ins_key == CMPSD) {	} else if (ins_key == CMPSQ) {	} else if (ins_key == SCASB) {	} else if (ins_key == SCASW) {	} else if (ins_key == SCASD) {	} else if (ins_key == SCASQ) {	} else if (ins_key == MOVSB) {	} else if (ins_key == MOVSW) {	} else if (ins_key == MOVSD) {	} else if (ins_key == MOVSQ) {	} else if (ins_key == LODSB) { 	} else if (ins_key == LODSW) { 	} else if (ins_key == LODSD) {	} else if (ins_key == LODSQ) {	} else if (ins_key == STOSB) {	} else if (ins_key == STOSW) {	} else if (ins_key == STOSD) {	} else if (ins_key == STOSQ) {	} else		return 0;	return 1;}int is_transfer_ins(i_key_t *ins_key){	if (ins_key == JMP) {	} else if (ins_key == CALL) {	} else if (ins_key == JO) { 	} else if (ins_key == JNO) {	} else if (ins_key == JB) {	} else if (ins_key == JNB) {	} else if (ins_key == JZ) {	} else if (ins_key == JNZ) {	} else if (ins_key == JBE) { 	} else if (ins_key == JNBE) {	} else if (ins_key == JS) {	} else if (ins_key == JNS) {	} else if (ins_key == JP) { 	} else if (ins_key == JNP) {	} else if (ins_key == JL) {	} else if (ins_key == JNL) {	} else if (ins_key == JLE) {	} else if (ins_key == JNLE) {	} else if (ins_key == LOOP) {	} else if (ins_key == LOOPZ) {	} else 		return 0;	return 1;}int is_imul_ins(i_key_t *i_key) {	int ret = 0;	if ((i_key >= IMUL) && (i_key < (IMUL + sizeof(IMUL))))		ret = 1;	return ret;}/****************************************************************/i_key_t *get_i_key(i_key_t *i_key, ops_attr_t *ops_attr){	if (!i_key || !ops_attr)			return 0;	unsigned int i_attr = 0;	unsigned int i_so_attr = 0;	unsigned int i_do_attr = 0;	unsigned int i_to_attr = 0;		unsigned int so_attr = ops_attr->so_attr;	unsigned int do_attr = ops_attr->do_attr;	unsigned int to_attr = ops_attr->to_attr;		while (i_key->opcode || i_key->i_attr) {		i_attr = i_key->i_attr;		i_so_attr = i_key->so_attr;		i_do_attr = i_key->do_attr;		i_to_attr = i_key->to_attr;		if (((i_so_attr == 0) && (so_attr != 0))			|| ((i_so_attr != 0) && (so_attr == 0))			|| ((i_do_attr == 0) && (do_attr != 0))			|| ((i_do_attr != 0) && (do_attr == 0))			|| ((i_to_attr == 0) && (to_attr != 0))				|| ((i_to_attr != 0) && (to_attr == 0))) 		{			i_key++;			continue;		}/*		if (((OPTYPE(i_so_attr) == 0) && (OPTYPE(so_attr) != 0)) 			|| ((SIZE(i_so_attr) == 0) && (SIZE(so_attr) != 0)) 			|| ((OPTYPE(i_so_attr) != 0) && (OPTYPE(so_attr) == 0))			|| ((SIZE(i_so_attr) != 0) && (SIZE(so_attr) == 0))			|| ((OPTYPE(i_do_attr) == 0) && (OPTYPE(do_attr) != 0))			|| ((SIZE(i_do_attr) == 0) && (SIZE(do_attr) != 0))			|| ((OPTYPE(i_do_attr) != 0) && (OPTYPE(do_attr) == 0))			|| ((SIZE(i_do_attr) != 0) && (SIZE(do_attr) == 0))			|| ((OPTYPE(i_to_attr) == 0) && (OPTYPE(to_attr) != 0))			|| ((SIZE(i_to_attr) == 0) && (SIZE(to_attr) != 0))			|| ((OPTYPE(i_to_attr) != 0) && (OPTYPE(to_attr) == 0))			|| ((SIZE(i_to_attr) != 0) && (SIZE(to_attr) == 0)))		{			i_key++;			continue;		}*/		if (((so_attr & i_so_attr) == so_attr) 	   	   && ((do_attr & i_do_attr) == do_attr)		   && ((to_attr & i_to_attr) == to_attr))		{			if (current_bits == 64) {				if (is_INVLD_IN_64(i_attr)) {					i_key++;					continue;				}			}			if (is_FS_64(i_attr) && (current_bits != 64)) {				i_key++;				continue;			}						return i_key;		}		i_key++;	}			return 0;}/*********************************************************/static void release_o_key(o_key_t *o_key){	if (o_key->mem)		a64_free(o_key->mem);		if (o_key->imme)		a64_free(o_key->imme);	a64_free(o_key);}static void release_ops_key(ops_key_t *ops_key){	if (ops_key->so_key)		release_o_key(ops_key->so_key);		if (ops_key->do_key)		release_o_key(ops_key->do_key);		if (ops_key->to_key)		release_o_key(ops_key->to_key);	a64_free(ops_key);}static void release_e_key(e_key_t *e_key){	if (e_key) {		if (e_key->ops_key)			release_ops_key(e_key->ops_key);/*	e_key->i_key it's not need malloc()!!!*/		if (e_key->i_prefix)			a64_free(e_key->i_prefix);	}	a64_free(e_key);}static void release_e_key_link(){	e_key_t *e_key_next;	while (e_key_link) {		e_key_next = e_key_link->next;		release_e_key(e_key_link);		e_key_link = e_key_next;	}}void release_resource(){	release_e_key_link();	release_label_table();	release_hole_link();	release_err_link();}void reset_environment(){	current_mode = LONG_64;	current_bits = 64;	current_pc = 0;	line = 0;	org = 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -