#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
//определение структуры для хранения меток и их адресов
struct Label {
std::string name;
int address;
};
//функция парсинга строки для получения команд и операндов
void parseLine(std::string line, std::string& command, std::vector<std::string>& operands) {
// ваша логика парсинга строки
}
//функция для чтения ассемблерной программы из файла
void readAssemblyFile(std::string filename, std::vector<std::string>& lines) {
std::ifstream file(filename);
if (
file.is _open()) {
std::string line;
while (std::getline(file, line)) {
lines.push_back(line);
}
file.close();
} else {
std::cout << "Unable to open file" << std::endl;
}
}
//функция для выделения меток и расчета их адресов
void processLabels(std::vector<std::string>& lines, std::map<std::string, int>& labelMap) {
// ваша логика обработки меток
}
//функция для формирования .com файла и вывода команд на экран
void generateComFile(std::vector<std::string>& lines, std::map<std::string, int>& labelMap) {
// ваша логика генерации .com файла
}
int main() {
std::vector<std::string> lines;
std::map<std::string, int> labelMap;
readAssemblyFile("input.asm", lines);
processLabels(lines, labelMap);
generateComFile(lines, labelMap);
return 0;
}
сделал ИИ (
ссылка )
r – операнд находится в регистре общего назначения (РОН);
m – операнд находится в основной памяти;
imm – непосредственный операнд.
Для обозначения схемы построения транслятора применяются сокращения:
2А – двухпросмотровый ассемблер;
1А>ОП – однопросмотровый ассемблер с непосредственной записью результата в оперативную память с целью выполнения сформированного объектного кода сразу после завершения ассемблирования;
1А>МД – однопросмотровый ассемблер, записывающий формируемый объектный код на магнитный диск;
МА – многопромотровый ассемблер;
ДА – программа дизассемблер – восстановление текста программы по объектному коду.
Дополнительно в задании указана разрядность процессора:
16 – 16-разрядный процессор или реальный режим 32-разрядных процессоров i80х86;
32 – 32-разрядный процессор, работающий в защищенном режиме.
Для заданий типа “1А>ОП” требуется разместить результаты ассемблирования в области данных, затем загрузить РОНы эталонными значениями, передать управление на сформированный объектный код. После исполнения объектного кода требуется распечатать содержимое памяти и/или регистров для доказательства правильности выполненного задания.
Для заданий типа “1А>МД” требуется дополнительно разработать простой формат файла с объектным кодом, а также простую программу-загрузчик. Программа-загрузчик должна программу из файла перенести в оперативную память, произвести необходимую настройку адресов и запустить эту программу на выполнение.
Исходные данные содержат команды вида:
МНЕМА r,r
МНЕМА r,imm
МНЕМА r,name
МНЕМА name,r
…
ret
name1 dw 5
…
namek dw 5
end
Здесь МНЕМА = [add, sub, cmp]. Операнд в памяти (m) может быть задан одним из следующих способов: namei, namei[BX], namei[BX+SI] , namei[BX+DI].
Требуется сформировать листинг для этого потока команд для случая 32-разрядных операндов.
Пример другого варианта:
Требуется разработать ассемблер для формирования выполняемого файла .сом формата. Представить скриншоты проверочных запусков полученной программы под управлением отладчика (td.exe).
Исходные данные содержат команды вида:
МНЕМА r,constanta
МНЕМА r,CL
МНЕМА m,constanta
МНЕМА m,CL
Здесь МНЕМА = [shr, shl]. Операнд в памяти (m) может быть задан одним из следующих способов: [BX], [SI], [DI], [BX+SI], [BX+DI].
Описание
Рассмотрим алгоритм решения текущей задачи.
1)Чтение файла с программой на ассемблере.
2)Рассмотрение каждой строки, определение типа команды и операндов.
3)Расчет смещения для каждой метки.
4)Если в качестве операнда выступала та или иная метка, то следует сохранить ее адрес.
5)Сохранение непрерывной строки из кодов команд в файл .com формата, а также вывод ее на экран(для удобства).
Стоит отметить, что для формирования реального .com файла пришлось также написать обработку команд вида:
lea регистр1, непосредственный операнд
mov регистр, память
ret
Код не смог прикрепить, код должен быть на C++