Мне нужно написать ассемблер MIPS на C / C ++. Прежде чем я начну писать какой-то код, я думаю, что на самом деле мне нужно потратить некоторое время и сначала спланировать. Мне нужно учесть около 15 инструкций MIPS, включая J, но не JR. Программа должна взять файл с разделами .text, .data и .word вместе с метками, а затем вывести файл с первой строкой в десятичном виде с количеством инструкций и количеством слов данных. Остальное — машинный код, закодированный в шестнадцатеричном формате. Последний набор строк состоит из шестнадцатеричных значений, представляющих начальные значения слов в сегменте данных. Я знаю, что мне нужно сделать 2 прохода, чтобы сначала проанализировать метки и инструкцию JUMP. В основном я просто ищу совет о том, как настроить структуры данных. Должен ли я сделать массив строк, которые содержат OPCODE, RS, RT, RD и т. Д., А затем преобразовать это в шестнадцатеричный как-то? Или есть лучший способ сделать это от кого-то, у кого есть какой-либо совет / опыт? Спасибо за вашу помощь / предложения!
Я действительно сделал это давным-давно для чего-то связанного с классным проектом! Вы правы в том, что сделали 2 прохода. Однако не используйте массив строк для регистров. На самом деле вам не нужно использовать строки вообще. Вы можете поместить OPCODE в перечисление, а регистры — в перечисление. Для 15 инструкций вы можете легко выполнить большую часть работы путем ручного кодирования инструкций switch-case, if-else вместо разработки полностью обобщенного решения. Может быть заманчиво использовать регулярные выражения, но для вашей задачи это не стоит усилий (хотя вы обязательно должны использовать любую возможность, которую вы получите, чтобы изучить регулярные выражения, если у вас есть время!). Затем используйте hashmap-подобные структуры для отображения между регистрами и OPCODE и их значениями HEX и используйте их. Вы можете делать любые вычисления адресов прямо в коде. Это всего лишь предположение, вам обязательно нужно поэкспериментировать. Моя главная мысль заключается в том, что если вы читаете строку, вы не должны хранить ее в той же форме, когда вы можете сначала обработать ее и сохранить что-то (читай: объект) более значимым.
По сути, вам нужен только первый проход для меток и т. Д. Вы можете сделать все остальное во втором проходе. Если вы посмотрите на типичную блок-схему компилятора / ассемблера в любом учебнике по O / S, вы можете легко эмулировать каждый шаг — это то, что я сделал.
Надеюсь это поможет!