#include #include #include #include #include #include enum OperandType { REGISTER, MEMORY, IMMEDIATE }; struct Operand { OperandType type; std::string value; }; struct Instruction { std::string mnemonic; Operand op1; Operand op2; }; std::map registerMap = { {"ax", 0}, {"bx", 1}, {"cx", 2}, {"dx", 3}, {"si", 4}, {"di", 5}, {"bp", 6}, {"sp", 7} }; std::map mnemonicMap = { {"add", 0}, {"sub", 1}, {"cmp", 2} }; Operand parseOperand(const std::string& str) { Operand operand; if (registerMap.find(str) != registerMap.end()) { operand.type = REGISTER; operand.value = str; } else if (str[0] == '[') { operand.type = MEMORY; operand.value = str; } else { operand.type = IMMEDIATE; operand.value = str; } return operand; } Instruction parseInstruction(const std::string& line) { std::istringstream stream(line); Instruction inst; std::string mnemonic, op1, op2; stream >> mnemonic >> op1 >> op2; inst.mnemonic = mnemonic; inst.op1 = parseOperand(op1); inst.op2 = parseOperand(op2); return inst; } std::string encodeInstruction(const Instruction& inst) { std::bitset<8> opcode(mnemonicMap[inst.mnemonic]); std::bitset<4> op1, op2; if (inst.op1.type == REGISTER) { op1 = std::bitset<4>(registerMap[inst.op1.value]); } else if (inst.op1.type == IMMEDIATE) { op1 = std::bitset<4>(std::stoi(inst.op1.value)); } else { // Handle memory operands } if (inst.op2.type == REGISTER) { op2 = std::bitset<4>(registerMap[inst.op2.value]); } else if (inst.op2.type == IMMEDIATE) { op2 = std::bitset<4>(std::stoi(inst.op2.value)); } else { // Handle memory operands } std::bitset<16> binaryInstruction((opcode.to_ulong() << 8) | (op1.to_ulong() << 4) | op2.to_ulong()); return binaryInstruction.to_string(); } int main() { std::vector lines = { "add ax, bx", "sub cx, 5", "cmp [bx+si], di" }; for (const auto& line : lines) { Instruction inst = parseInstruction(line); std::string binaryCode = encodeInstruction(inst); std::cout << "Instruction: " << line << " -> Binary: " << binaryCode << std::endl; } return 0; }
Требуется разработать:
систему признаков для фиксации результатов обработки операндов, таблицу машинных операций;
алгоритмы анализа и синтеза машинных операций.
Результат обработки должен максимально совпадать с теми данными, которые формирует стандартный ассемблер (tasm, masm или ассемблер для ОС Linux). В текстах заданий для указания операндов используются следующие обозначения:
r – операнд находится в регистре общего назначения (РОН);
m – операнд находится в основной памяти;
imm – непосредственный операнд.
Исходные данные содержат команды вида:
МНЕМА r,r
МНЕМА r,imm
МНЕМА r,m
…
Здесь МНЕМА = [add, sub, cmp]. Операнд в памяти (m) может быть задан одним из следующих способов: [BX], [BP], [BX+DISP], [BP+DISP] , [SI+DISP], [DI+DISP].
Требуется сформировать листинг для этого потока команд для случая 16-разрядных операндов.
Пример на другом варианте: