Главная страница

компилятор ТСС. Tiny c compiler by Fabrice Bellard Описание алгоритмов


Скачать 191.99 Kb.
НазваниеTiny c compiler by Fabrice Bellard Описание алгоритмов
Анкоркомпилятор ТСС
Дата08.11.2019
Размер191.99 Kb.
Формат файлаodt
Имя файлаtcc book.odt
ТипДокументы
#94047
страница17 из 38
1   ...   13   14   15   16   17   18   19   20   ...   38
void move_reg(int r, int s) Вызывается save_reg() Временный экземпляр SValue заполняются необходимыми значениями и для нее вызывается load(). Действия выполянются если переданное занчение оличается от того что находится в рекистре. void load(int r, SValue *sv) В SValue проверяется поле r если в нем присутсвуют биты входящие в маску VT_LVAL, то происходит следующая обработка: Если биты входящие VT_VALMASK кодируют VT_LLOCAL В типе временного SValue устанавливается код VT_INT. В поле r уставливаются биты VT_LOCAL | VT_LVAL. CType поле ul обноляется соответствующим значением. Вызывается load() для временного SValue Сохраненному регистру присваивается знаение r Для VT_FLOAT, VT_DOUBLE, VT_LDOUBLE, VT_FLOAT, VT_DOUBLE, VT_LDOUBLE, VT_BYTE, VT_SHORT вызывается o() с соответствующим опкодом. Окод так же зависит от бита T_UNSIGNED. Для некоторых типов изменияется значение r Если ни один из упомянутых бит не установлен испоьлзется опкод 0x8 (movl) Вызывается gen_modrm() Если в сохраненном значении поля r нет бит входящих в маску VT_LVAL, то проверяются биты входящие в маску VT_VALMASK Для VT_CONST, VT_LOCAL, VT_CMP, VT_JMP и VT_JMPI вызываются сосстветствующие им комбинации функций o(), gen_addr32(), oad(), gsym(). Если ни один из указанных бит не установлен, дважды вызывается o() void o(unsigned int c) Функция сдвигает переданное ей значение на 8 бит вправо. И повторяет это действие пока значение не обнулится. Перед каждым сдвигом вызывается g() void g(int c) Счетчик байт в текущей секции кода увеличивается на 1 и проверяется нужно ли выделить еще памяти В последнюю позицию записывается переданное значение. Позиция обновляется увеличенным знаением. static int oad(int c, int s) Счетчик байт в текущей секции кода увеличивается на 4 и проверяется нужно ли выделить еще памяти В последнюю позицию записывается переданное значение. Позиция обновляется увеличенным знаением. static void gen_modrm(int op_reg, int r, Sym *sym, int c) Если переданное значение кодирует VT_CONST, вызывается o(), gen_addr32() Если кодирует VT_LOCAL, то переданный параметр c проверятся на наличие страших бит. Если их нет вызывается o() и g(), иначе oad() Если значение не кодирует указанные значения, вызывается g() static void gen_addr32(int r, Sym *sym, int c) Если в переданном значении присутствуют VT_SYM, то вызывается greloc() Вызывается gen_le32() void gen_le32(int c) Четыре раза вызывается g() для обработки переданного значения. Каждый раз оно сдвигается на 8 бит вправо. static void greloc(Section *s, Sym *sym,
1   ...   13   14   15   16   17   18   19   20   ...   38


написать администратору сайта