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

@@ -2,7 +2,7 @@ use core::fmt;
use std::{fs::File, io::Read, process::exit};
use crate::aout::Aout;
use crate::instructions::{ImmediateOperand, MemoryIndex, ModRmTarget};
use crate::instructions::{ImmediateOperand, MemoryIndex, ModRmTarget, Pointer};
use crate::register::{Register, RegisterId, SegmentRegister};
use crate::{
Args,
@@ -143,7 +143,7 @@ impl Disassembler {
displacement = Some(ImmediateOperand::Word(self.parse_word()));
}
0b11 => {
log::debug!("ModRM to reg");
log::debug!("ModRM (0b{:b}) to/from Register (0b{:b})", rm, reg);
// XXX: find a nicer way instead of using Byte(0) and Word(0)
let target = match width {
ImmediateOperand::Byte(_) => {
@@ -409,6 +409,39 @@ impl Disassembler {
0x8D => modrmv!(self, LEA),
0x8F => {
let target = self.parse_modrm_byte(ImmediateOperand::Word(0)).0;
let mem = match target {
ModRmTarget::Memory(idx) => idx,
_ => panic!("POP_M instruction given a register to pop into"),
};
Mnemonic::POP_M(mem)
}
0x90 => Mnemonic::NOP(),
0x91 => Mnemonic::XCHG_AX(Register::CX),
0x92 => Mnemonic::XCHG_AX(Register::DX),
0x93 => Mnemonic::XCHG_AX(Register::BX),
0x94 => Mnemonic::XCHG_AX(Register::SP),
0x95 => Mnemonic::XCHG_AX(Register::BP),
0x96 => Mnemonic::XCHG_AX(Register::SI),
0x97 => Mnemonic::XCHG_AX(Register::DI),
0x98 => Mnemonic::CBW,
0x99 => Mnemonic::CWD,
0x9A => Mnemonic::CALL(Pointer {
segment: self.parse_word(),
offset: self.parse_word(),
}),
0x9B => Mnemonic::WAIT,
0x9C => Mnemonic::PUSHF,
0x9D => Mnemonic::POPF,
0x9E => Mnemonic::SAHF,
0x9F => Mnemonic::LAHF,
0xCD => Mnemonic::INT(self.parse_byte()),
0xBB => Mnemonic::MOV_BXIv(self.parse_word()),