ft: implement some more mnemonics
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user