📄 arm2x86_mem.c
字号:
/* This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public License alongwith this program; if not, write to the Free Software Foundation, Inc.,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *//* * author teawater <c7code-uc@yahoo.com.cn> <teawater@gmail.com> */#include "armdefs.h"#include "arm2x86_self.h"uint32_ttea_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_ttea_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_ttea_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_ttea_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);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__)) arm2x86_pfun = (uint32_t) ARMul_ReadWord; __asm__ __volatile__ ("call *arm2x86_pfun");#else arm2x86_pfun = (volatile void(*))ARMul_ReadWord; 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);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__)) arm2x86_pfun = (uint32_t) ARMul_ReadWord; __asm__ __volatile__ ("call *arm2x86_pfun");#else arm2x86_pfun = (volatile void(*))ARMul_ReadWord; 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);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__)) arm2x86_pfun = (uint32_t) ARMul_LoadHalfWord; __asm__ __volatile__ ("call *arm2x86_pfun");#else arm2x86_pfun = (volatile void(*))ARMul_LoadHalfWord; 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);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__)) arm2x86_pfun = (uint32_t) ARMul_ReadByte; __asm__ __volatile__ ("call *arm2x86_pfun");#else arm2x86_pfun = (volatile void(*))ARMul_ReadByte; 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);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__)) arm2x86_pfun = (uint32_t) ARMul_ReadByte; __asm__ __volatile__ ("call *arm2x86_pfun");#else arm2x86_pfun = (volatile void(*))ARMul_ReadByte; 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){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_str_T0_T1"); //ARMul_WriteWord(st, T1, T0); __asm__ __volatile__ ("subl $0x4, %esp"); __asm__ __volatile__ ("push %" AREG_T0); __asm__ __volatile__ ("push %" AREG_T1); __asm__ __volatile__ ("push %" AREG_st);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__)) arm2x86_pfun = (uint32_t) ARMul_WriteWord; __asm__ __volatile__ ("call *arm2x86_pfun");#else arm2x86_pfun = (volatile void(*))ARMul_WriteWord; wmb (); (*arm2x86_pfun) ();#endif __asm__ __volatile__ ("addl $0x10, %esp"); 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_str_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_strh_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_strh_T0_T1"); //ARMul_StoreHalfWord(st, T1, T0); __asm__ __volatile__ ("subl $0x4, %esp"); __asm__ __volatile__ ("push %" AREG_T0); __asm__ __volatile__ ("push %" AREG_T1); __asm__ __volatile__ ("push %" AREG_st);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__)) arm2x86_pfun = (uint32_t) ARMul_StoreHalfWord; __asm__ __volatile__ ("call *arm2x86_pfun");#else arm2x86_pfun = (volatile void(*))ARMul_StoreHalfWord; wmb (); (*arm2x86_pfun) ();#endif __asm__ __volatile__ ("addl $0x10, %esp"); if (st->abortSig != LOW) { st->trap = TRAP_DATA_ABORT; if (st->abort_model < 2) { //if (st->is_XScale) { __asm__ __volatile__ ("ret"); } } OP_END ("get_op_strh_T0_T1"); *len = end - begin; return ((uint8_t *) begin);}uint8_t *get_op_strb_T0_T1 (int *len){ unsigned int begin = 0, end = 0; OP_BEGIN ("get_op_strb_T0_T1"); //ARMul_WriteByte(st, T1, T0); __asm__ __volatile__ ("subl $0x4, %esp"); __asm__ __volatile__ ("push %" AREG_T0); __asm__ __volatile__ ("push %" AREG_T1); __asm__ __volatile__ ("push %" AREG_st);//chy 2005-05-11#if !(defined(__CYGWIN__) || defined(__MINGW32__) || defined(__APPLE__))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -