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

📄 arm2x86_mem.c

📁 这是Skyeye 0.9 版本的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "armdefs.h"
#include "arm2x86_self.h"

uint32_t
tea_ldm(ARMul_State * state, ARMword address, ARMword reg_map)
{
	int		i;
	ARMword		data;

	for(i = 0; i < 16; i++) {
		arm2x86_tmp_reg[i] = state->Reg[i];
		if (reg_map & (1 << i)) {
			data = ARMul_ReadWord(state, address);
			if (state->abortSig != LOW) {
				state->trap = TRAP_DATA_ABORT;
				//if (state->is_XScale) {
				if (!state->abort_model) {
					return(0);
				}
				else {
					break;
				}
			}

			if (i == 15) {
				arm2x86_tmp_reg[i] = (data & (~3)) + 4;
			}
			else {
				arm2x86_tmp_reg[i] = data;
			}

			address += 4;
		}
	}
	if (state->trap != TRAP_DATA_ABORT) {
		for(i = 0; i < 16; i++) {
			state->Reg[i] = arm2x86_tmp_reg[i];
		}
		address -= 4;
	}

	return(address);
}

uint32_t
tea_ldm_user(ARMul_State * state, ARMword address, ARMword reg_map)
{
	int		i;
	ARMword		data;

	for(i = 0; i < 15; i++) {
		if (((state->Mode == FIQ26MODE || state->Mode == FIQ32MODE) && (i >= 8)) || (i >= 13)) {
			arm2x86_tmp_reg[i] = state->RegBank[USERBANK][i];
		}
		else {
			arm2x86_tmp_reg[i] = state->Reg[i];
		}
		arm2x86_tmp_reg[i] = state->Reg[i];
		if (reg_map & (1 << i)) {
			data = ARMul_ReadWord(state, address);
			if (state->abortSig != LOW) {
				state->trap = TRAP_DATA_ABORT;
				//if (state->is_XScale) {
				if (!state->abort_model) {
					return(0);
				}
				else {
					break;
				}
			}

			/*if (((state->Mode == FIQ26MODE || state->Mode == FIQ32MODE) && (i >= 8)) || (i >= 13)) {
				state->RegBank[USERBANK][i] = data;
			}
			else {
				state->Reg[i] = data;
			}*/
			arm2x86_tmp_reg[i] = data;

			address += 4;
		}
	}
	if (state->trap != TRAP_DATA_ABORT) {
		for(i = 0; i < 15; i++) {
			if (((state->Mode == FIQ26MODE || state->Mode == FIQ32MODE) && (i >= 8)) || (i >= 13)) {
				state->RegBank[USERBANK][i] = arm2x86_tmp_reg[i];
			}
			else {
				state->Reg[i] = arm2x86_tmp_reg[i];
			}
		}
		address -= 4;
	}

	return(address);
}

uint32_t
tea_stm(ARMul_State * state, ARMword address, ARMword reg_map)
{
	int		i;

	for(i = 0; i < 16; i++) {
		if (reg_map & (1 << i)) {
			if (i == 15) {
				ARMul_WriteWord(state, address, state->Reg[i] + 4);
			}
			else {
				ARMul_WriteWord(state, address, state->Reg[i]);
			}
			if (state->abortSig != LOW) {
				state->trap = TRAP_DATA_ABORT;
				//if (state->is_XScale) {
				if (!state->abort_model) {
					return(0);
				}
				else {
					break;
				}
			}

			address += 4;
		}
	}
	if (state->trap != TRAP_DATA_ABORT) {
		address -= 4;
	}

	return(address);
}

uint32_t
tea_stm_user(ARMul_State * state, ARMword address, ARMword reg_map)
{
	int		i;

	for(i = 0; i < 16; i++) {
		if (reg_map & (1 << i)) {
			if (i == 15) {
				ARMul_WriteWord(state, address, state->Reg[i] + 4);
			}
			else {
				if (((state->Mode == FIQ26MODE || state->Mode == FIQ32MODE) && (i >= 8)) || (i >= 13)) {
					ARMul_WriteWord(state, address, state->RegBank[USERBANK][i]);
				}
				else {
					ARMul_WriteWord(state, address, state->Reg[i]);
				}
			}
			if (state->abortSig != LOW) {
				state->trap = TRAP_DATA_ABORT;
				//if (state->is_XScale) {
				if (!state->abort_model) {
					return(0);
				}
				else {
					break;
				}
			}

			address += 4;
		}
	}
	if (state->trap != TRAP_DATA_ABORT) {
		address -= 4;
	}

	return(address);
}
//--------------------------------------------------------------------------------------------------

uint8_t *
get_op_ldr_T0_T1(int *len)
{
	unsigned int	begin=0,end=0;

	OP_BEGIN("get_op_ldr_T0_T1");
	//T0 = ARMul_ReadWord(st, T1);
	__asm__ __volatile__ ("subl	$0x8, %esp");
	__asm__ __volatile__ ("push	%"AREG_T1);
	__asm__ __volatile__ ("push	%"AREG_st);
	arm2x86_pfun = (uint32_t)ARMul_ReadWord;
//chy 2005-05-11
#ifndef __CYGWIN__
	__asm__ __volatile__ ("call	*arm2x86_pfun");
#else
	wmb();
	(*arm2x86_pfun)();
#endif
	__asm__ __volatile__ ("addl	$0x10, %esp");
	__asm__ __volatile__ ("movl	%eax, %"AREG_T0);

	if (st->abortSig != LOW) {
		st->trap = TRAP_DATA_ABORT;
		//if (st->is_XScale) {
		if (st->abort_model < 2) {
			__asm__ __volatile__ ("ret");
		}
	}
	if (T1 & 3) {
		T0 = LOADWORD_ALIGN(T1, T0);
	}
	OP_END("get_op_ldr_T0_T1");
	*len = end - begin;

	return((uint8_t *)begin);
}

uint8_t *
get_op_ldr_T2_T1(int *len)
{
	unsigned int	begin=0,end=0;

	OP_BEGIN("get_op_ldr_T2_T1");
	//T2 = ARMul_ReadWord(st, T1);
	__asm__ __volatile__ ("subl	$0x8, %esp");
	__asm__ __volatile__ ("push	%"AREG_T1);
	__asm__ __volatile__ ("push	%"AREG_st);
	arm2x86_pfun = (uint32_t)ARMul_ReadWord;
//chy 2005-05-11
#ifndef __CYGWIN__
	__asm__ __volatile__ ("call	*arm2x86_pfun");
#else
	wmb();
	(*arm2x86_pfun)();
#endif
	__asm__ __volatile__ ("addl	$0x10, %esp");
	__asm__ __volatile__ ("movl	%eax, %"AREG_T2);

	if (st->abortSig != LOW) {
		st->trap = TRAP_DATA_ABORT;
		//if (st->is_XScale) {
		if (st->abort_model < 2) {
			__asm__ __volatile__ ("ret");
		}
	}

	if (T1 & 3) {
		T2 = LOADWORD_ALIGN(T1, T2);
	}
	OP_END("get_op_ldr_T2_T1");
	*len = end - begin;

	return((uint8_t *)begin);
}

uint8_t *
get_op_ldrh_T0_T1(int *len)
{
	unsigned int	begin=0,end=0;

	OP_BEGIN("get_op_ldrh_T0_T1");
	//T0 = ARMul_LoadHalfWord(st, T1);
	__asm__ __volatile__ ("subl	$0x8, %esp");
	__asm__ __volatile__ ("push	%"AREG_T1);
	__asm__ __volatile__ ("push	%"AREG_st);
	arm2x86_pfun = (uint32_t)ARMul_LoadHalfWord;
//chy 2005-05-11
#ifndef __CYGWIN__
	__asm__ __volatile__ ("call	*arm2x86_pfun");
#else
	wmb();
	(*arm2x86_pfun)();
#endif
	__asm__ __volatile__ ("addl	$0x10, %esp");
	__asm__ __volatile__ ("movl	%eax, %"AREG_T0);

	if (st->abortSig != LOW) {
		st->trap = TRAP_DATA_ABORT;
		//if (st->is_XScale) {
		if (st->abort_model < 2) {
			__asm__ __volatile__ ("ret");
		}
	}
	OP_END("get_op_ldrh_T0_T1");
	*len = end - begin;

	return((uint8_t *)begin);
}

uint8_t *
get_op_ldrb_T0_T1(int *len)
{
	unsigned int	begin=0,end=0;

	OP_BEGIN("get_op_ldrb_T0_T1");
	//T0 = ARMul_ReadByte(st, T1);
	__asm__ __volatile__ ("subl	$0x8, %esp");
	__asm__ __volatile__ ("push	%"AREG_T1);
	__asm__ __volatile__ ("push	%"AREG_st);
	arm2x86_pfun = (uint32_t)ARMul_ReadByte;
//chy 2005-05-11
#ifndef __CYGWIN__
	__asm__ __volatile__ ("call	*arm2x86_pfun");
#else
	wmb();
	(*arm2x86_pfun)();
#endif
	__asm__ __volatile__ ("addl	$0x10, %esp");
	__asm__ __volatile__ ("movl	%eax, %"AREG_T0);

	if (st->abortSig != LOW) {
		st->trap = TRAP_DATA_ABORT;
		//if (st->is_XScale) {
		if (st->abort_model < 2) {
			__asm__ __volatile__ ("ret");
		}
	}
	OP_END("get_op_ldrb_T0_T1");
	*len = end - begin;

	return((uint8_t *)begin);
}

uint8_t *
get_op_ldrb_T2_T1(int *len)
{
	unsigned int	begin=0,end=0;

	OP_BEGIN("get_op_ldrb_T2_T1");
	//T2 = ARMul_ReadByte(st, T1);
	__asm__ __volatile__ ("subl	$0x8, %esp");
	__asm__ __volatile__ ("push	%"AREG_T1);
	__asm__ __volatile__ ("push	%"AREG_st);
	arm2x86_pfun = (uint32_t)ARMul_ReadByte;
//chy 2005-05-11
#ifndef __CYGWIN__
	__asm__ __volatile__ ("call	*arm2x86_pfun");
#else
	wmb();
	(*arm2x86_pfun)();
#endif	
	__asm__ __volatile__ ("addl	$0x10, %esp");
	__asm__ __volatile__ ("movl	%eax, %"AREG_T2);

	if (st->abortSig != LOW) {
		st->trap = TRAP_DATA_ABORT;
		//if (st->is_XScale) {
		if (st->abort_model < 2) {
			__asm__ __volatile__ ("ret");
		}
	}
	OP_END("get_op_ldrb_T2_T1");
	*len = end - begin;

	return((uint8_t *)begin);
}

uint8_t *
get_op_str_T0_T1(int *len)

⌨️ 快捷键说明

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