Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите решить на C++ Потоки ассемблерных команд

Влад Иванов Ученик (93), на голосовании 5 месяцев назад
Задания связаны с проектированием ассемблеров. Исходными данными являются потоки ассемблерных команд, записанные в соответствии с правилами языка Ассемблера.
Требуется разработать:
систему признаков для фиксации результатов обработки операндов, таблицу машинных операций;
алгоритмы анализа и синтеза машинных операций.
Результат обработки должен максимально совпадать с теми данными, которые формирует стандартный ассемблер (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-разрядных операндов.
Пример на другом варианте:

Голосование за лучший ответ
Татьяна Просветленный (36384) 6 месяцев назад
 #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;
}
Похожие вопросы