Pass asize_32 and get_seg_prefix to string instructions

This commit is contained in:
Fabian 2020-12-31 19:14:30 -06:00
parent a73988a817
commit ca2409b024
4 changed files with 310 additions and 296 deletions

View file

@ -2833,8 +2833,8 @@ pub unsafe fn get_reg_asize(reg: i32) -> i32 {
};
}
pub unsafe fn set_ecx_asize(value: i32) {
if is_asize_32() {
pub unsafe fn set_ecx_asize(is_asize_32: bool, value: i32) {
if is_asize_32 {
*reg32.offset(ECX as isize) = value
}
else {
@ -2842,9 +2842,9 @@ pub unsafe fn set_ecx_asize(value: i32) {
};
}
pub unsafe fn add_reg_asize(reg: i32, value: i32) {
pub unsafe fn add_reg_asize(is_asize_32: bool, reg: i32, value: i32) {
dbg_assert!(reg == ECX || reg == ESI || reg == EDI);
if is_asize_32() {
if is_asize_32 {
*reg32.offset(reg as isize) += value;
}
else {
@ -2852,8 +2852,8 @@ pub unsafe fn add_reg_asize(reg: i32, value: i32) {
};
}
pub unsafe fn decr_ecx_asize() -> i32 {
return if is_asize_32() {
pub unsafe fn decr_ecx_asize(is_asize_32: bool) -> i32 {
return if is_asize_32 {
*reg32.offset(ECX as isize) -= 1;
*reg32.offset(ECX as isize)
}

View file

@ -922,17 +922,17 @@ pub unsafe fn instr32_6B_reg(r1: i32, r: i32, imm: i32) {
write_reg32(r, imul_reg32(read_reg32(r1), imm));
}
#[no_mangle]
pub unsafe fn instr_6C() { insb_no_rep(); }
pub unsafe fn instr_6C() { insb_no_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr16_6D() { insw_no_rep(); }
pub unsafe fn instr16_6D() { insw_no_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr32_6D() { insd_no_rep(); }
pub unsafe fn instr32_6D() { insd_no_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr_6E() { outsb_no_rep(); }
pub unsafe fn instr_6E() { outsb_no_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr16_6F() { outsw_no_rep(); }
pub unsafe fn instr16_6F() { outsw_no_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr32_6F() { outsd_no_rep(); }
pub unsafe fn instr32_6F() { outsd_no_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr_80_0_mem(addr: i32, imm: i32) {
SAFE_READ_WRITE8!(___, addr, add8(___, imm));
@ -1613,17 +1613,17 @@ pub unsafe fn instr32_A3(moffs: i32) {
));
}
#[no_mangle]
pub unsafe fn instr_A4() { movsb_no_rep(); }
pub unsafe fn instr_A4() { movsb_no_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr16_A5() { movsw_no_rep(); }
pub unsafe fn instr16_A5() { movsw_no_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr32_A5() { movsd_no_rep(); }
pub unsafe fn instr32_A5() { movsd_no_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr_A6() { cmpsb_no_rep(); }
pub unsafe fn instr_A6() { cmpsb_no_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr16_A7() { cmpsw_no_rep(); }
pub unsafe fn instr16_A7() { cmpsw_no_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr32_A7() { cmpsd_no_rep(); }
pub unsafe fn instr32_A7() { cmpsd_no_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr_A8(imm8: i32) { test8(*reg8.offset(AL as isize) as i32, imm8); }
#[no_mangle]
@ -1631,23 +1631,23 @@ pub unsafe fn instr16_A9(imm16: i32) { test16(*reg16.offset(AX as isize) as i32,
#[no_mangle]
pub unsafe fn instr32_A9(imm32: i32) { test32(*reg32.offset(EAX as isize), imm32); }
#[no_mangle]
pub unsafe fn instr_AA() { stosb_no_rep(); }
pub unsafe fn instr_AA() { stosb_no_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr16_AB() { stosw_no_rep(); }
pub unsafe fn instr16_AB() { stosw_no_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr32_AB() { stosd_no_rep(); }
pub unsafe fn instr32_AB() { stosd_no_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr_AC() { lodsb_no_rep(); }
pub unsafe fn instr_AC() { lodsb_no_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr16_AD() { lodsw_no_rep(); }
pub unsafe fn instr16_AD() { lodsw_no_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr32_AD() { lodsd_no_rep(); }
pub unsafe fn instr32_AD() { lodsd_no_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr_AE() { scasb_no_rep(); }
pub unsafe fn instr_AE() { scasb_no_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr16_AF() { scasw_no_rep(); }
pub unsafe fn instr16_AF() { scasw_no_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr32_AF() { scasd_no_rep(); }
pub unsafe fn instr32_AF() { scasd_no_rep(is_asize_32()); }
pub unsafe fn instr_B0(imm8: i32) { *reg8.offset(AL as isize) = imm8 as u8; }
pub unsafe fn instr_B1(imm8: i32) { *reg8.offset(CL as isize) = imm8 as u8; }
@ -3028,29 +3028,29 @@ pub unsafe fn instr32_FF_6_reg(r1: i32) {
return_on_pagefault!(push32(read_reg32(r1)));
}
#[no_mangle]
pub unsafe fn instr_F26C() { insb_rep(); }
pub unsafe fn instr_F26C() { insb_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr_F36C() { insb_rep(); }
pub unsafe fn instr_F36C() { insb_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr16_F26D() { insw_rep(); }
pub unsafe fn instr16_F26D() { insw_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr16_F36D() { insw_rep(); }
pub unsafe fn instr16_F36D() { insw_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr32_F26D() { insd_rep(); }
pub unsafe fn instr32_F26D() { insd_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr32_F36D() { insd_rep(); }
pub unsafe fn instr32_F36D() { insd_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr_F26E() { outsb_rep(); }
pub unsafe fn instr_F26E() { outsb_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr_F36E() { outsb_rep(); }
pub unsafe fn instr_F36E() { outsb_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr16_F26F() { outsw_rep(); }
pub unsafe fn instr16_F26F() { outsw_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr16_F36F() { outsw_rep(); }
pub unsafe fn instr16_F36F() { outsw_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr32_F26F() { outsd_rep(); }
pub unsafe fn instr32_F26F() { outsd_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr32_F36F() { outsd_rep(); }
pub unsafe fn instr32_F36F() { outsd_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr16_70(imm8: i32) { jmpcc16(test_o(), imm8); }
#[no_mangle]
@ -3116,65 +3116,65 @@ pub unsafe fn instr32_7E(imm8: i32) { jmpcc32(test_le(), imm8); }
#[no_mangle]
pub unsafe fn instr32_7F(imm8: i32) { jmpcc32(!test_le(), imm8); }
#[no_mangle]
pub unsafe fn instr_F2A4() { movsb_rep(); }
pub unsafe fn instr_F2A4() { movsb_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr_F3A4() { movsb_rep(); }
pub unsafe fn instr_F3A4() { movsb_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr16_F2A5() { movsw_rep(); }
pub unsafe fn instr16_F2A5() { movsw_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr16_F3A5() { movsw_rep(); }
pub unsafe fn instr16_F3A5() { movsw_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr32_F2A5() { movsd_rep(); }
pub unsafe fn instr32_F2A5() { movsd_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr32_F3A5() { movsd_rep(); }
pub unsafe fn instr32_F3A5() { movsd_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr_F2A6() { cmpsb_rep(PREFIX_F2); }
pub unsafe fn instr_F2A6() { cmpsb_rep(PREFIX_F2, is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr_F3A6() { cmpsb_rep(PREFIX_F3); }
pub unsafe fn instr_F3A6() { cmpsb_rep(PREFIX_F3, is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr16_F2A7() { cmpsw_rep(PREFIX_F2); }
pub unsafe fn instr16_F2A7() { cmpsw_rep(PREFIX_F2, is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr16_F3A7() { cmpsw_rep(PREFIX_F3); }
pub unsafe fn instr16_F3A7() { cmpsw_rep(PREFIX_F3, is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr32_F2A7() { cmpsd_rep(PREFIX_F2); }
pub unsafe fn instr32_F2A7() { cmpsd_rep(PREFIX_F2, is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr32_F3A7() { cmpsd_rep(PREFIX_F3); }
pub unsafe fn instr32_F3A7() { cmpsd_rep(PREFIX_F3, is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr_F2AA() { stosb_rep(); }
pub unsafe fn instr_F2AA() { stosb_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr_F3AA() { stosb_rep(); }
pub unsafe fn instr_F3AA() { stosb_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr16_F2AB() { stosw_rep(); }
pub unsafe fn instr16_F2AB() { stosw_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr16_F3AB() { stosw_rep(); }
pub unsafe fn instr16_F3AB() { stosw_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr32_F2AB() { stosd_rep(); }
pub unsafe fn instr32_F2AB() { stosd_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr32_F3AB() { stosd_rep(); }
pub unsafe fn instr32_F3AB() { stosd_rep(is_asize_32()); }
#[no_mangle]
pub unsafe fn instr_F2AC() { lodsb_rep(); }
pub unsafe fn instr_F2AC() { lodsb_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr_F3AC() { lodsb_rep(); }
pub unsafe fn instr_F3AC() { lodsb_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr16_F2AD() { lodsw_rep(); }
pub unsafe fn instr16_F2AD() { lodsw_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr16_F3AD() { lodsw_rep(); }
pub unsafe fn instr16_F3AD() { lodsw_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr32_F2AD() { lodsd_rep(); }
pub unsafe fn instr32_F2AD() { lodsd_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr32_F3AD() { lodsd_rep(); }
pub unsafe fn instr32_F3AD() { lodsd_rep(is_asize_32(), get_seg_prefix(DS)); }
#[no_mangle]
pub unsafe fn instr_F2AE() { scasb_rep(PREFIX_F2); }
pub unsafe fn instr_F2AE() { scasb_rep(PREFIX_F2, is_asize_32()); }
#[no_mangle]
pub unsafe fn instr_F3AE() { scasb_rep(PREFIX_F3); }
pub unsafe fn instr_F3AE() { scasb_rep(PREFIX_F3, is_asize_32()); }
#[no_mangle]
pub unsafe fn instr16_F2AF() { scasw_rep(PREFIX_F2); }
pub unsafe fn instr16_F2AF() { scasw_rep(PREFIX_F2, is_asize_32()); }
#[no_mangle]
pub unsafe fn instr16_F3AF() { scasw_rep(PREFIX_F3); }
pub unsafe fn instr16_F3AF() { scasw_rep(PREFIX_F3, is_asize_32()); }
#[no_mangle]
pub unsafe fn instr32_F2AF() { scasd_rep(PREFIX_F2); }
pub unsafe fn instr32_F2AF() { scasd_rep(PREFIX_F2, is_asize_32()); }
#[no_mangle]
pub unsafe fn instr32_F3AF() { scasd_rep(PREFIX_F3); }
pub unsafe fn instr32_F3AF() { scasd_rep(PREFIX_F3, is_asize_32()); }
#[no_mangle]
pub unsafe fn instr_D8_0_mem(addr: i32) { fpu_fadd(0, return_on_pagefault!(fpu_load_m32(addr))); }

View file

@ -114,19 +114,23 @@ pub unsafe fn jmpcc32(condition: bool, imm32: i32) {
};
}
#[no_mangle]
pub unsafe fn loope16(imm8s: i32) { jmpcc16(0 != decr_ecx_asize() && getzf(), imm8s); }
pub unsafe fn loope16(imm8s: i32) { jmpcc16(0 != decr_ecx_asize(is_asize_32()) && getzf(), imm8s); }
#[no_mangle]
pub unsafe fn loopne16(imm8s: i32) { jmpcc16(0 != decr_ecx_asize() && !getzf(), imm8s); }
pub unsafe fn loopne16(imm8s: i32) {
jmpcc16(0 != decr_ecx_asize(is_asize_32()) && !getzf(), imm8s);
}
#[no_mangle]
pub unsafe fn loop16(imm8s: i32) { jmpcc16(0 != decr_ecx_asize(), imm8s); }
pub unsafe fn loop16(imm8s: i32) { jmpcc16(0 != decr_ecx_asize(is_asize_32()), imm8s); }
#[no_mangle]
pub unsafe fn jcxz16(imm8s: i32) { jmpcc16(get_reg_asize(ECX) == 0, imm8s); }
#[no_mangle]
pub unsafe fn loope32(imm8s: i32) { jmpcc32(0 != decr_ecx_asize() && getzf(), imm8s); }
pub unsafe fn loope32(imm8s: i32) { jmpcc32(0 != decr_ecx_asize(is_asize_32()) && getzf(), imm8s); }
#[no_mangle]
pub unsafe fn loopne32(imm8s: i32) { jmpcc32(0 != decr_ecx_asize() && !getzf(), imm8s); }
pub unsafe fn loopne32(imm8s: i32) {
jmpcc32(0 != decr_ecx_asize(is_asize_32()) && !getzf(), imm8s);
}
#[no_mangle]
pub unsafe fn loop32(imm8s: i32) { jmpcc32(0 != decr_ecx_asize(), imm8s); }
pub unsafe fn loop32(imm8s: i32) { jmpcc32(0 != decr_ecx_asize(is_asize_32()), imm8s); }
#[no_mangle]
pub unsafe fn jcxz32(imm8s: i32) { jmpcc32(get_reg_asize(ECX) == 0, imm8s); }

File diff suppressed because it is too large Load diff