Ynicky 0 9 июня, 2010 Опубликовано 9 июня, 2010 · Жалоба Исправил несколько ошибок. Проверил АЛУ без SMUL (пока нет), load/store. Николай. rf32.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 9 июня, 2010 Опубликовано 9 июня, 2010 (изменено) · Жалоба Принцип получения hex-файла машинных кодов: компилятор a2m в "машинный"Си будет также автоматически генерировать файл "code.c" для Си-скрипта "machine.c", запускаемого после a2m. Си-скрипт м/б выполнен TinyCC с ключом "-run". В приложении пробная версия "machine.c"(с выводом мнемоник вместо hex-кодов) и тестовый "code.c". Для настройки на конкретную систему команд в "machine.c" надо поменять текстовый вывод мнемоник на вывод соответствующих hex-кодов. Переменная "p" обеспечивает несколько проходов(2) для "подгонки" относительных адресов инструкций, тк их число зависит от данных(добавлений "imm20"). "t"!=0 означает константу. Остальное, думаю, понятно будет из исходника. "a2m" позже подправлю под вывод "code.c". machine.zip Изменено 9 июня, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 16 июня, 2010 Опубликовано 16 июня, 2010 · Жалоба Концепцию немного поменял, "a2.exe" выводит код для Си-препроцессора. Не хватает времени, не сделал вывод hex-кодов для конкретного процессора - в "a2b.c" надо поменять текстовый вывод мнемоник на вывод соответствующих hex-кодов ("a2a.c" настроил для конкретного 2х-операндного процессора). A2.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 16 июня, 2010 Опубликовано 16 июня, 2010 (изменено) · Жалоба Пример вывода hex-кодов для некоторых команд (mov, cmp, и тп) в "a2b.c", для остальных делается аналогично. М/б стоит переписать "a2a.c" и "a2b.c", чтобы проще было вводить/править hex-коды команд. a2b.txt Изменено 16 июня, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ynicky 0 17 июня, 2010 Опубликовано 17 июня, 2010 (изменено) · Жалоба Пример вывода hex-кодов для некоторых команд (mov, cmp, и тп) в "a2b.c", для остальных делается аналогично. М/б стоит переписать "a2a.c" и "a2b.c", чтобы проще было вводить/править hex-коды команд. Что означает hex-код? Файлы a2a.c и a2b.c идентичны. Николай. P.S. С hex-кодом разобрался. Это AL2 в a2b.txt. А в hex-код можно добавить комментарий в виде мнемоники команд? Тогда будет проще править. Изменено 17 июня, 2010 пользователем Ynicky Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 17 июня, 2010 Опубликовано 17 июня, 2010 · Жалоба В "a2b.c" я еще исправил ошибку, вернул необходимые пары "{" "}" (случайно выкинул, когда "причесывал") - иначе неправильно считает адреса команд. Думаю, надо переписать "a2a.c" и "a2b.c", чтобы были комменты, и удобно было править. Но сейчас много дел навалилось, освобожусь - займусь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 17 июня, 2010 Опубликовано 17 июня, 2010 · Жалоба В "a2b.c" надо вместо "00" кодов операций поставить реальные. Вывод комментов добавил. A2.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 18 июня, 2010 Опубликовано 18 июня, 2010 · Жалоба По поводу слотов задержки в командах условных переходов. В FPGA вся память - двухпортовая, можно использовать для упреждающей выборки альтернативной инструкции из памяти программ - выигрываем 1 такт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ynicky 0 18 июня, 2010 Опубликовано 18 июня, 2010 · Жалоба По поводу слотов задержки в командах условных переходов. В FPGA вся память - двухпортовая, можно использовать для упреждающей выборки альтернативной инструкции из памяти программ - выигрываем 1 такт. В принципе, можно вообще обойтись без слотов задержки, как, например, в ARM-е. Тогда мы будем терять 3 слота задержки при невыполнении условия перехода (flush). Можно, конечно, сделать альтернативную выборку команд и не терять ни одного слота, переключаясь на альтернативную ветку конвейера. Но это, по моему, будет привязывать данную архитектуру только к FPGA. Как это может сочетаться с кеш, пока не знаю. Николай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ynicky 0 20 июня, 2010 Опубликовано 20 июня, 2010 · Жалоба В "a2b.c" надо вместо "00" кодов операций поставить реальные. Вывод комментов добавил. Есть вопросы по командам в "a2b.c". 1. "TST" - это операция "AND" без записи в регистр (т.е. только изменение флагов)? 2. "BZ","BNZ" - ветвление, если результат "=0" и "/=0"? Дело в том, что с командами "CMP" все условия ветвления сравниваются с '0'. Значит ли это, что их можно приравнять к командам "BEQ" и "BNE"? 3. Что из себя представляют команды: "COM", "LDI", "LDD", "LDDI", "STI", "STD", "STDI"? 4. "ASL" и "ASR" - это команды арифметического или логического сдвига? Исправил еще несколько ошибок в процессоре. Николай. rf32.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 20 июня, 2010 Опубликовано 20 июня, 2010 (изменено) · Жалоба 1. "TST" - любая операция без записи в регистр, устанавливающая нужные флаги для "BZ","BNZ". Можно "CMP" с нулевой константой. 2. "BZ","BNZ" - ветвление, если результат "=0" и "/=0"? Да. Значит ли это, что их можно приравнять к командам "BEQ" и "BNE"? Напрямую не получится, тк "0" задан неявно. Либо в "ассемблерном" Си всегда писать "if(a!=0)..." и "if(a==0)..." вместо "if(a)..." и "if(!a)...", либо ввести формальные команды "BZ" и"BNZ", подразумеавющие сравнение с нулем. В фактической системе команд они не нужны, и в машинных кодах заменяются "BEQ" и "BNE" с нулевой константой. "3. ... COM", "LDI", "LDD", "LDDI", "STI", "STD", "STDI" COM: Ra=~Ra; LDI: Ra=*Imm; LDD: Ra=Rb[Rc]; LDDI: Ra=Rb[imm]; STI: *Imm=Ra; STD: Ra[Rb]=Rc; STDI: Ra[Rb]=Imm; "LDD" и "STD" - для 3х-операндной системы команд. "LDDI" и "STDI" получаются "за компанию". 4. "ASL" и "ASR" - это команды арифметического или логического сдвига? То-же, что и "<<" и ">>" в Си. Можно добавлять свои команды например: #define MAX( a, b ) AL2( max, maxi, a, b ); и определить соответствующие коды "max" и "maxi", из Си можно вызывать: MAX( a, b ); Но тогда для отладки в Си надо определить в тестовых программах: #define MAX( a, b ) if( a < b ) a = b и тд и тп. Для другой архитектуры "a2a.c" и "a2b.c" будут другими, а вот "a2с.c" менять не понадобится. Изменено 20 июня, 2010 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ynicky 0 20 июня, 2010 Опубликовано 20 июня, 2010 · Жалоба То-же, что и "<<" и ">>" в Си. Насколько я знаю, "<<" - это всегда логический сдвиг, а ">>" - либо логический либо арифметический, в зависимости от переменной (беззнаковой или знаковой). Это так? Николай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 20 июня, 2010 Опубликовано 20 июня, 2010 · Жалоба Для чисел в дополнительном коде арифметический и логический сдвиг влево - результат одинаковый. а ">>" - либо логический либо арифметический, в зависимости от переменной (беззнаковой или знаковой). Это так? Да. У меня пока только один тип "int", и поэтому подразумевается только арифметический сдвиг. В принципе, ввести дополнительные типы несложно, но проект, судя по всему, развиваться не будет(мало участников) - поэтому не вижу смысла (сам предпочитаю "бестиповую" архитектуру). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ynicky 0 20 июня, 2010 Опубликовано 20 июня, 2010 · Жалоба проект, судя по всему, развиваться не будет(мало участников) Согласен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 20 июня, 2010 Опубликовано 20 июня, 2010 · Жалоба На всякий случай посмотрел стандарт на ANSI C, там результат сдвига вправо знаковых чисел - зависит от реализации. Согласен. Надеюсь, кое-какая польза все-таки была извлечена из этого проекта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться