Перейти к содержанию
    

Принцип получения 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

Изменено пользователем Leka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Концепцию немного поменял, "a2.exe" выводит код для Си-препроцессора.

Не хватает времени, не сделал вывод hex-кодов для конкретного процессора - в "a2b.c" надо поменять текстовый вывод мнемоник на вывод соответствующих hex-кодов ("a2a.c" настроил для конкретного 2х-операндного процессора).

A2.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример вывода hex-кодов для некоторых команд (mov, cmp, и тп) в "a2b.c", для остальных делается аналогично. М/б стоит переписать "a2a.c" и "a2b.c", чтобы проще было вводить/править hex-коды команд.

a2b.txt

Изменено пользователем Leka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример вывода hex-кодов для некоторых команд (mov, cmp, и тп) в "a2b.c", для остальных делается аналогично. М/б стоит переписать "a2a.c" и "a2b.c", чтобы проще было вводить/править hex-коды команд.

Что означает hex-код? Файлы a2a.c и a2b.c идентичны.

 

Николай.

 

P.S.

С hex-кодом разобрался. Это AL2 в a2b.txt.

А в hex-код можно добавить комментарий в виде мнемоники команд?

Тогда будет проще править.

Изменено пользователем Ynicky

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В "a2b.c" я еще исправил ошибку, вернул необходимые пары "{" "}" (случайно выкинул, когда "причесывал") - иначе неправильно считает адреса команд.

Думаю, надо переписать "a2a.c" и "a2b.c", чтобы были комменты, и удобно было править. Но сейчас много дел навалилось, освобожусь - займусь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В "a2b.c" надо вместо "00" кодов операций поставить реальные.

 

Вывод комментов добавил.

A2.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу слотов задержки в командах условных переходов. В FPGA вся память - двухпортовая, можно использовать для упреждающей выборки альтернативной инструкции из памяти программ - выигрываем 1 такт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу слотов задержки в командах условных переходов. В FPGA вся память - двухпортовая, можно использовать для упреждающей выборки альтернативной инструкции из памяти программ - выигрываем 1 такт.

В принципе, можно вообще обойтись без слотов задержки, как, например, в ARM-е.

Тогда мы будем терять 3 слота задержки при невыполнении условия перехода (flush).

Можно, конечно, сделать альтернативную выборку команд и не терять ни одного слота,

переключаясь на альтернативную ветку конвейера.

Но это, по моему, будет привязывать данную архитектуру только к FPGA.

Как это может сочетаться с кеш, пока не знаю.

 

Николай.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В "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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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" менять не понадобится.

Изменено пользователем Leka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То-же, что и "<<" и ">>" в Си.

Насколько я знаю, "<<" - это всегда логический сдвиг, а ">>" - либо логический либо арифметический,

в зависимости от переменной (беззнаковой или знаковой). Это так?

 

Николай.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для чисел в дополнительном коде арифметический и логический сдвиг влево - результат одинаковый.

 

а ">>" - либо логический либо арифметический,

в зависимости от переменной (беззнаковой или знаковой). Это так?

Да. У меня пока только один тип "int", и поэтому подразумевается только арифметический сдвиг.

 

В принципе, ввести дополнительные типы несложно, но проект, судя по всему, развиваться не будет(мало участников) - поэтому не вижу смысла (сам предпочитаю "бестиповую" архитектуру).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На всякий случай посмотрел стандарт на ANSI C, там результат сдвига вправо знаковых чисел - зависит от реализации.

 

Согласен.

Надеюсь, кое-какая польза все-таки была извлечена из этого проекта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...