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

📄 a64-2.c

📁 Intel x86处理器的汇编器
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *	a64.h for mik's assembler attribute */#include "a64-2.h"#include "opcode.h"/* *	x86-64 full registers */reg_t regs[] = {	/* 1-byte regs */	{ "al", 0x10 }, { "cl", 0x11 }, { "dl", 0x12 }, { "bl", 0x13 },	{ "ah", 0x14 }, { "spl", 0x14 }, { "ch", 0x15 }, { "bpl", 0x15 },	{ "dh", 0x16 }, { "sil", 0x16 }, { "bh", 0x17 }, { "dil", 0x17 },	{ "r8b", 0x18 }, { "r9b",0x19 }, { "r10b", 0x1a }, { "r11b", 0x1b },	{ "r12b", 0x1c }, { "r13b", 0x1d }, { "r14b", 0x1e }, { "r15b", 0x1f },	/* 2-bytes regs */	{ "ax", 0x20 }, { "cx", 0x21 }, { "dx", 0x22 }, { "bx", 0x23 },	{ "sp", 0x24 }, { "bp", 0x25 }, { "si", 0x26 }, { "di", 0x27 },	{ "r8w", 0x28 }, { "r9w", 0x29 }, { "r10w", 0x2a }, { "r11w", 0x2b },	{ "r12w", 0x2c }, { "r13w", 0x2d }, { "r14w", 0x2e }, { "r15w", 0x2f },	/* 4-bytes regs */	{ "eax", 0x40 }, { "ecx", 0x41 }, { "edx", 0x42 }, { "ebx", 0x43 },	{ "esp", 0x44 }, { "ebp", 0x45 }, { "esi", 0x46 }, { "edi", 0x47 },	{ "r8d", 0x48 }, { "r9d", 0x49 }, { "r10d", 0x4a }, { "r11d", 0x4b },	{ "r12d", 0x4c }, { "r13d", 0x4d }, { "r14d", 0x4e}, { "r15d", 0x4f },		/* 8-bytes regs */	{ "rax", 0x80 }, { "rcx", 0x81 }, { "rdx", 0x82 }, { "rbx", 0x83 },	{ "rsp", 0x84 }, { "rbp", 0x85 }, { "rsi", 0x86 }, { "rdi", 0x87 },	{ "r8", 0x88 }, { "r9", 0x89 }, { "r10", 0x8a }, { "r11", 0x8b },	{ "r12", 0x8c }, { "r13", 0x8d }, { "r14", 0x8e }, { "r15", 0x8f },	/* 64-bit mmx regs */	{ "mmx0", 0xe0 }, { "mmx1", 0xe1 }, { "mmx2", 0xe2 }, { "mmx3", 0xe3 },	{ "mmx4", 0xe4 }, { "mmx5", 0xe5 }, { "mmx6", 0xe6 }, { "mmx7", 0xe7 },	/* 128-bit xmm regs */	{ "xmm0", 0xf0 }, { "xmm1", 0xf1 }, { "xmm2", 0xf2 }, { "xmm3", 0xf3 },	{ "xmm4", 0xf4 }, { "xmm5", 0xf5 }, { "xmm6", 0xf6 }, { "xmm7", 0xf7 },	{ "xmm8", 0xf8 }, { "xmm9", 0xf9 }, { "xmm10", 0xfa }, {"xmm11", 0xfb},	{ "xmm12", 0xfc }, { "xmm13", 0xfd }, {"xmm14", 0xfe}, {"xmm15", 0xff},		/* segment regs */	{"es", 0xa0}, {"cs", 0xa1}, {"ss", 0xa2}, 	{"ds", 0xa3}, {"fs", 0xa4}, {"gs", 0xa5},	/* control regs */	{ "cr0", 0xc0 }, { "cr1", 0xc1 }, { "cr2", 0xc2 }, { "cr3", 0xc3 },	{ "cr4", 0xc4 }, { "cr5", 0xc5 }, { "cr6", 0xc6 }, { "cr7", 0xc7 },	{ "cr8", 0xc8 }, { "cr9", 0xc9 }, { "cr10", 0xca }, { "cr11", 0xcb },	{ "cr12", 0xcc }, { "cr13", 0xcd }, { "cr14", 0xce }, { "cr15", 0xcf },	/* debug regs */	{ "dr0", 0xd0 }, { "dr1", 0xd1 }, { "dr2", 0xd2 }, { "dr3", 0xd3 },	{ "dr4", 0xd4 }, { "dr5", 0xd5 }, { "dr6", 0xd6 }, { "dr7", 0xd7 },	{ "dr8", 0xd8 }, { "dr9", 0xd9 }, { "dr10", 0xda }, { "dr11", 0xdb }, 	{ "dr12", 0xdc }, { "dr13", 0xdd }, { "dr14", 0xde }, { "dr15", 0xdf },	/* end flag */	{ 0, 0 }};/******************************************************/oseg_t osegs[] = {	{ "cs", 0x2e }, { "ds", 0x3e }, { "es", 0x26 },	{ "fs", 0x64 }, { "gs", 0x65 }, { "ss", 0x36 },	/* end flag */	{ 0, 0 }};scale_t scales[] = {	{ "1", 0x10 }, { "2", 0x21 }, { "4", 0x42 }, { "8", 0x83 },	{ 0, 0 } /* end flag */};cast_t casts[] = {	{ "byte", 8 }, { "word", 16 }, { "dword", 32 }, { "qword", 64 },	{ "near", NEAR_ID }, { "far", FAR_ID },	{ 0, 0 } /* end flag */};i_prefix_t i_prefixs[] = {	{ "lock", 0xf0 }, { "rep", 0xf3 }, { "repe", 0xf3 },	{ "repz", 0xf3 }, { "repne", 0xf2 }, { "repnz", 0xf2 },	{ 0, 0 }};/******************************************************************/keyword_t keyword[] = {	{ "mode", KW_MODE }, { "bits", KW_BITS },	{ "org", KW_ORG },	{ "byte", KW_BYTE }, { "word", KW_WORD },	{ "dword", KW_DWORD }, { "qword", KW_QWORD },	{ "dqword", KW_DQWORD }, { "ptr", KW_PTR },	{ "const", KW_CONST }, { "function", KW_FUNCTION },	{ "var", KW_VAR }, { "macro", KW_MACRO },	{ "text", KW_TEXT }, { "code", KW_CODE },	{ 0, 0 }};bitmode_t modes[] = {	{ "long.64", 64 }, { "long.compatibility", 32 },	{ "protected", 32 }, { "v86", 16 }, { "real", 16 },	{ 0, 0 }};bits_t bits[] = {	{ "16", 16 }, { "32", 32 }, { "64", 64 },	{ 0, 0 }};/************************************************************//***** 	a64 gloabl variable *****/          unsigned int current_mode = LONG_64;unsigned int current_bits = 64;unsigned long long current_pc = 0;unsigned long long org = 0;unsigned long line = 0;e_key_t *e_key_link = 0;/* *	a64.h's function  *//* the memcpy of a64 */#define do_mem_copy(dest, src, size)			\	asm("movl %0, %%edi; movl %1, %%esi;		\		movl %2, %%ecx; movl %%ecx, %%eax;	\		shr $2, %%ecx; rep movsl;		\		movl %%eax, %%ecx; andl $3, %%ecx;	\		rep movsb"				\		:					\		: "r" (dest), "r" (src), "r" (size)	\	);#define do_mem_zero(ptr, size)			\	asm("movl %0, %%edi; movl %1, %%ecx;	\		xorl %%eax, %%eax; rep stosb"	\		:				\		: "r" (ptr), "r" (size)		\	);	__inline__ void mem_copy(void *dest, void *src, unsigned int size){	do_mem_copy(dest, src, size);}__inline__ void mem_zero(void *ptr, unsigned int size){	do_mem_zero(ptr, size);}void *a64_malloc(unsigned int size){	void *ptr = (void *)malloc(size);	if (!ptr) {		printf("error! no enought memory\n");			release_resource();				exit(1);	}	mem_zero(ptr, size);	return ptr;}void a64_free(void *ptr){	free(ptr);}int str_cmp(char *d, char *s) {	if (!d || !s)		return 0;	while (*d && *d == *s) {		d++; s++;	}			return ((*d == *s) && (*(d-1) == *(s-1)));}int str_len(char *s) {	char *p = s;	if (!p) return 0;	while (*p) p++;	return p - s;}int str_cat(char *d, char *s){	char *p = d;	if (!d || !s) return 0;		while (*d) d++;	while (*s) *d++ = *s++;	return d - p;}/*************************************************************************************************************/int trim_space(char *d, char *s){	if (!d || !s || !s[0]) 		return 0;	int i = 0, j = 0;	char *p = s;	char *q = s;	while (*s) {		if (*s != ' ') 			*d++ = *s++;		else if (s == p) {	/* head */			while (*s && (*s == ' ')) s++;		} else {			q = s - 1;			while (*s && (*s == ' ')) s++;			if ((is_c(*q) || is_n(*q)) && (is_c(*s) || is_n(*s)))				*d++ = ' ';		}	}	*d = 0;	return 1;}int get_c(char *s, char c) {	int ret = 0;		while (*s) {		ret += (*s == c);		s++;	}	return ret;}int is_c(char c) {	return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')));}int is_n(char c) {	return ((c >= '0') && (c <= '9'));}int is_hc(char c) {	return (((c >= 'a') && (c <= 'f')) || ((c >= 'A') && (c <= 'F')));}int is_dec(char *s) {	if (!s) return 0;	while (*s) {		if (!(*s >= '0' && *s <= '9'))			return 0;		s++;	}	return 1;}int is_hex(char *s) {	if (!s) return 0;	if ((*s == '0') && (*(s+1) == 'x' || *(s+1) == 'X')) 	{		s += 2;		while (*s) {			if (!(is_n(*s) || is_hc(*s)))				return 0;			s++;		}		} else if ((*s == '0') && is_hc(*(s+1))) {		s += 2;		while (*s) {			if (!(is_n(*s) || is_hc(*s)))				break;			s++;		}		if (*s == 0) 			return 0;		if ((*s == 'h' || *s == 'H') && (*(s+1) == 0))			return 1;	} else 		return 0;	return 1;}int is_binary(char *s) {	if (!s) return 0;	while (*s && (*s == '0' || *s == '1')) 		s++;	if (*s == 0)		return 0;	else if ((*s == 'b' || *s == 'B') && (*(s+1) == 0))		return 1;	else 		return 0;	return 1;}int is_numeric(char *s) {	int ret = 0;	if (!s) return 0;		if (is_c(*s))		return 0;	if (!(ret = is_hex(s)))		if (!(ret = is_dec(s)))			ret = is_binary(s);	return ret;}int get_sizeof(long long n) {	int ret = 0;		if (n < 0)		n = -n;	union {		long long ll;		long l[2];		char c[4];	} u;	u.ll = n;/*	if (n) {		if (u.l[1])			ret = 8;		else if (n <= 0xff)			ret = 1;		else if (n <= 0xffff)			ret = 2;		else if (n <= 0xffffffff)			ret = 4;	} */	if (n) {		if (u.l[1])			ret = 8;		else if (u.c[3] || u.c[2])			ret = 4;		else if (u.c[1])			ret = 2;		else if (u.c[0])			ret = 1;	} else		ret = 1;		return ret;}/* ----------------------------------------------- */unsigned char get_regid(char *s) {	reg_t *p = regs;		if (!s || !s[0])		return 0;	while (p->reg && !str_cmp(s, p->reg))		p++;	return p->reg_id;}unsigned char get_osegid(char *s) {	oseg_t *p = osegs;		if (!s || !s[0])		return 0;	while (p->oseg && !str_cmp(s, p->oseg))		p++;		return p->oseg_id;}unsigned char get_scaleid(char *s) {	scale_t *p = scales;	if (!s || !s[0])		return 0;	while (p->scale && !str_cmp(s, p->scale))		p++;		return p->scale_id;}unsigned char get_castid(char *s) {	cast_t *p = casts;	if (!s || !s[0]) 		return 0;		while (p->cast && !str_cmp(s, p->cast))		p++;	return p->cast_id;}unsigned char get_prefixid(char *s){	i_prefix_t *p = i_prefixs;	if (!s || !s[0])		return 0;	while (p->prefix && !str_cmp(s, p->prefix))		p++;	return p->prefix_id;}unsigned char get_modeid(char *s) {	bitmode_t *p = modes;	if (!s || !s[0])		return 0;

⌨️ 快捷键说明

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