ft: implement some more mnemonics

This commit is contained in:
2025-05-14 10:39:07 +09:00
parent f7446c14b1
commit a61b82fe22
2 changed files with 69 additions and 8 deletions

View File

@@ -68,18 +68,19 @@ impl fmt::Display for Instruction {
pub enum Mnemonic {
NOP(),
// ADD
ADD_FromReg(ModRmTarget, Register),
ADD_ToReg(ModRmTarget, Register),
ADD_Ib(ModRmTarget, ImmediateByte),
ADD_Iv(ModRmTarget, ImmediateWord),
ADD_FromReg(ModRmTarget, Register), // From Register into either Memory or Register
ADD_ToReg(ModRmTarget, Register), // From either Memory or Register into Reigster
ADD_Ib(ModRmTarget, ImmediateByte), // From Immediate into either Memory or Register
ADD_Iv(ModRmTarget, ImmediateWord), // From Immediate into either Memory or Register
ADD_ALIb(ImmediateByte),
ADD_AXIv(ImmediateWord),
// PUSH
PUSH_R(Register),
PUSH_S(SegmentRegister),
// POP
POP_S(SegmentRegister),
POP_R(Register),
POP_S(SegmentRegister), // POP to Segment Register
POP_R(Register), // POP to Register
POP_M(MemoryIndex), // POP to Memory
// OR
OR_FromReg(ModRmTarget, Register),
OR_ToReg(ModRmTarget, Register),
@@ -161,6 +162,7 @@ pub enum Mnemonic {
TEST(ModRmTarget, Register),
//XHCG
XHCG(ModRmTarget, Register),
XCHG_AX(Register), // from AX
// MOV
MOV_FromReg(ModRmTarget, Register),
MOV_ToReg(ModRmTarget, Register),
@@ -169,6 +171,18 @@ pub enum Mnemonic {
MOV_BXIv(ImmediateWord),
// LEA
LEA(ModRmTarget, Register),
// Sign extensions
CBW,
CWD,
// CALL
CALL(Pointer),
// WAIT
WAIT,
// Push/Pop Flags
PUSHF,
POPF,
SAHF,
LAHF,
// INT
INT(ImmediateByte),
}
@@ -182,6 +196,7 @@ impl fmt::Display for Mnemonic {
Self::CMP_Iv(mem, imm) => write!(f, "cmp {}, {:04x}", mem, imm),
Self::LEA(mem, reg) => write!(f, "lea {}, {}", reg, mem),
Self::MOV_BXIv(word) => write!(f, "mov bx, {:04x}", word),
Self::MOV_FromReg(target, reg) => write!(f, "mov {}, {}", target, reg),
Self::XOR_FromReg(mem, reg) => write!(f, "xor {}, {}", mem, reg),
_ => write!(f, "??? ??, ??"),
}
@@ -236,3 +251,16 @@ impl fmt::Display for MemoryIndex {
}
}
}
#[derive(Debug, Clone)]
/// 32-bit segment:offset pointer (e.g. for CALL instruction)
pub struct Pointer {
pub segment: ImmediateWord,
pub offset: ImmediateWord,
}
impl std::fmt::Display for Pointer {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}:{}", self.segment, self.offset)
}
}