📄 x86_emit.h
字号:
/* gameplaySP * * Copyright (C) 2006 Exophase <exophase@gmail.com> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, 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 of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */#ifndef X86_EMIT_H#define X86_EMIT_Hu32 x86_update_gba(u32 pc);// Although these are defined as a function, don't call them as// such (jump to it instead)void x86_indirect_branch_arm(u32 address);void x86_indirect_branch_thumb(u32 address);void x86_indirect_branch_dual(u32 address);void step_debug_x86(u32 pc);typedef enum{ x86_reg_number_eax, x86_reg_number_ecx, x86_reg_number_edx, x86_reg_number_ebx, x86_reg_number_esp, x86_reg_number_ebp, x86_reg_number_esi, x86_reg_number_edi} x86_reg_number;#define x86_emit_byte(value) \ *translation_ptr = value; \ translation_ptr++ \#define x86_emit_dword(value) \ *((u32 *)translation_ptr) = value; \ translation_ptr += 4 \typedef enum{ x86_mod_mem = 0, x86_mod_mem_disp8 = 1, x86_mod_mem_disp32 = 2, x86_mod_reg = 3} x86_mod;#define x86_emit_mod_rm(mod, rm, spare) \ x86_emit_byte((mod << 6) | (spare << 3) | rm) \#define x86_emit_mem_op(dest, base, offset) \ if(offset == 0) \ { \ x86_emit_mod_rm(x86_mod_mem, base, dest); \ } \ else \ \ if(((s32)offset < 127) && ((s32)offset > -128)) \ { \ x86_emit_mod_rm(x86_mod_mem_disp8, base, dest); \ x86_emit_byte((s8)offset); \ } \ else \ { \ x86_emit_mod_rm(x86_mod_mem_disp32, base, dest); \ x86_emit_dword(offset); \ } \#define x86_emit_reg_op(dest, source) \ x86_emit_mod_rm(x86_mod_reg, source, dest) \typedef enum{ x86_opcode_mov_rm_reg = 0x89, x86_opcode_mov_reg_rm = 0x8B, x86_opcode_mov_reg_imm = 0xB8, x86_opcode_mov_rm_imm = 0x00C7, x86_opcode_ror_reg_imm = 0x01C1, x86_opcode_shl_reg_imm = 0x04C1, x86_opcode_shr_reg_imm = 0x05C1, x86_opcode_sar_reg_imm = 0x07C1, x86_opcode_push_reg = 0x50, x86_opcode_push_rm = 0xFF, x86_opcode_push_imm = 0x0668, x86_opcode_call_offset = 0xE8, x86_opcode_ret = 0xC3, x86_opcode_test_rm_imm = 0x00F7, x86_opcode_test_reg_rm = 0x85, x86_opcode_mul_eax_rm = 0x04F7, x86_opcode_imul_eax_rm = 0x05F7, x86_opcode_idiv_eax_rm = 0x07F7, x86_opcode_add_rm_imm = 0x0081, x86_opcode_and_rm_imm = 0x0481, x86_opcode_sub_rm_imm = 0x0581, x86_opcode_xor_rm_imm = 0x0681, x86_opcode_add_reg_rm = 0x03, x86_opcode_adc_reg_rm = 0x13, x86_opcode_or_reg_rm = 0x0B, x86_opcode_sub_reg_rm = 0x2B, x86_opcode_xor_reg_rm = 0x33, x86_opcode_cmp_reg_rm = 0x39, x86_opcode_cmp_rm_imm = 0x053B, x86_opcode_lea_reg_rm = 0x8D, x86_opcode_j = 0x80, x86_opcode_jmp = 0xE9, x86_opcode_jmp_reg = 0x04FF, x86_opcode_ext = 0x0F} x86_opcodes;typedef enum{ x86_condition_code_o = 0x00, x86_condition_code_no = 0x01, x86_condition_code_c = 0x02, x86_condition_code_nc = 0x03, x86_condition_code_z = 0x04, x86_condition_code_nz = 0x05, x86_condition_code_na = 0x06, x86_condition_code_a = 0x07, x86_condition_code_s = 0x08, x86_condition_code_ns = 0x09, x86_condition_code_p = 0x0A, x86_condition_code_np = 0x0B, x86_condition_code_l = 0x0C, x86_condition_code_nl = 0x0D, x86_condition_code_ng = 0x0E, x86_condition_code_g = 0x0F} x86_condition_codes;#define x86_relative_offset(source, offset, next) \ ((u32)offset - ((u32)source + next)) \#define x86_unequal_operands(op_a, op_b) \ (x86_reg_number_##op_a != x86_reg_number_##op_b) \#define x86_emit_opcode_1b_reg(opcode, dest, source) \{ \ x86_emit_byte(x86_opcode_##opcode); \ x86_emit_reg_op(x86_reg_number_##dest, x86_reg_number_##source); \} \#define x86_emit_opcode_1b_mem(opcode, dest, base, offset) \{ \ x86_emit_byte(x86_opcode_##opcode); \ x86_emit_mem_op(x86_reg_number_##dest, x86_reg_number_##base, offset); \} \#define x86_emit_opcode_1b(opcode, reg) \ x86_emit_byte(x86_opcode_##opcode | x86_reg_number_##reg) \#define x86_emit_opcode_1b_ext_reg(opcode, dest) \ x86_emit_byte(x86_opcode_##opcode & 0xFF); \ x86_emit_reg_op(x86_opcode_##opcode >> 8, x86_reg_number_##dest) \#define x86_emit_opcode_1b_ext_mem(opcode, base, offset) \ x86_emit_byte(x86_opcode_##opcode & 0xFF); \ x86_emit_mem_op(x86_opcode_##opcode >> 8, x86_reg_number_##base, offset) \#define x86_emit_mov_reg_mem(dest, base, offset) \ x86_emit_opcode_1b_mem(mov_reg_rm, dest, base, offset) \#define x86_emit_mov_mem_reg(source, base, offset) \ x86_emit_opcode_1b_mem(mov_rm_reg, source, base, offset) \#define x86_emit_mov_reg_reg(dest, source) \ if(x86_unequal_operands(dest, source)) \ { \ x86_emit_opcode_1b_reg(mov_reg_rm, dest, source) \ } \#define x86_emit_mov_reg_imm(dest, imm) \ x86_emit_opcode_1b(mov_reg_imm, dest); \ x86_emit_dword(imm) \#define x86_emit_mov_mem_imm(imm, base, offset) \ x86_emit_opcode_1b_ext_mem(mov_rm_imm, base, offset); \ x86_emit_dword(imm) \#define x86_emit_shl_reg_imm(dest, imm) \ x86_emit_opcode_1b_ext_reg(shl_reg_imm, dest); \ x86_emit_byte(imm) \#define x86_emit_shr_reg_imm(dest, imm) \ x86_emit_opcode_1b_ext_reg(shr_reg_imm, dest); \ x86_emit_byte(imm) \#define x86_emit_sar_reg_imm(dest, imm) \ x86_emit_opcode_1b_ext_reg(sar_reg_imm, dest); \ x86_emit_byte(imm) \#define x86_emit_ror_reg_imm(dest, imm) \ x86_emit_opcode_1b_ext_reg(ror_reg_imm, dest); \ x86_emit_byte(imm) \#define x86_emit_add_reg_reg(dest, source) \ x86_emit_opcode_1b_reg(add_reg_rm, dest, source) \#define x86_emit_adc_reg_reg(dest, source) \ x86_emit_opcode_1b_reg(adc_reg_rm, dest, source) \#define x86_emit_sub_reg_reg(dest, source) \ x86_emit_opcode_1b_reg(sub_reg_rm, dest, source) \#define x86_emit_or_reg_reg(dest, source) \ x86_emit_opcode_1b_reg(or_reg_rm, dest, source) \#define x86_emit_xor_reg_reg(dest, source) \ x86_emit_opcode_1b_reg(xor_reg_rm, dest, source) \#define x86_emit_add_reg_imm(dest, imm) \ if(imm != 0) \ { \ x86_emit_opcode_1b_ext_reg(add_rm_imm, dest); \ x86_emit_dword(imm); \ } \#define x86_emit_sub_reg_imm(dest, imm) \ if(imm != 0) \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -