LINUX.ORG.RU

Качество кода компилятора

 


0

2

Добрый день. Я не являюсь экспертом в области computer science и к тому же, в разработке компиляторов. Знаю, что у intel процессора можно провести анализ и поделить на группы то или иное действие, чтобы составить грамотный код. Сначала я анализировал опкоды, всё сравнивал, нашел некоторую логику, но как бы не хотелось, в других опкодах [в построении опкодов] я логику не наблюдал, и решил сделать простым монотонным способом, то-есть объявить каждый опкод процессора.

Выглядит это не сложно, и поэтому кажется, что не очень круто. Как вы думаете, стоит ли провести нормальный анализ и поделить на составные части, ведь к примеру, опкоды, которые имеют у себя в начале 0x80-0x83 опкоды имеют под собой логичную трактовку и можно сделать парсер для реверс инжиниринга, но дальнейшие опкоды я так и не понял.

В итоге, я тупо добавляю все опкоды в простую структуру, файл чьей предоставлю в конце сообщения.

Я прикупил несколько нетбуков asus eee pc 700 и одну хорошую батарею. На этих нетбуках был windows xp. На одном оставит xp, а на другом поставил openbsd, но места оказалось мало, даже без иксов и игр, так как требуется поставить туда компилятор, а он весит много.

Так как у меня есть желание делать свою ось, чтобы кайфовать от процесса, я решил сначала написать свой компилятор ассемблера, и думаю какой язык высокого уровня воспроизвести, C или свой написать? Это риторический вопрос. На тех нетбуках должен быть простой процессор. Если мне удасться написать всё что задумал, то будет хорошее резюме, но не только резюме меня тянет этим заниматься. У меня есть пару книг, которые я бы хотел прочесть, а без практики их не интересно читать.

Вот код как выглядит составление ассемблерных опкодов.

#include <stdio.h>
#include <stdint.h>

enum {
	AAA,
	AAD,
	AAM,
	AAS,
	ADC,
	ADD,
	AND
};

#define MAX_BYTES_IN_OPCODE_PREFIX              4

#define REQUIRED_NO                             0
#define REQUIRED_VAL                            1

enum {
	RM8_R8,
	RM16_R16,
	R8_RM8,
	R16_RM16,
	AL_IMM8,
	AX_IMM16,
	RM8_IMM8,
	RM16_IMM16,
	RM16_IMM8,
	VALUE_NO_TYPE
};


#define MAY_NO                                  0
#define MAY_16_32_BITS                          1

#define REQUIRED_NO_SECOND_REG                  0
#define REQUIRED_SECOND_REG                     1

struct opcode_definition {
	uint32_t val;
	const char *str_val;
	uint32_t is_required_val;
	void (*build_bytes) (struct opcode_definition *def);
	uint8_t prefix_bytes[4];
	uint32_t prefix_size;
	uint32_t value_type;
	uint32_t total_operator;
	uint32_t may_32;
	uint32_t need_second_reg;
	uint8_t second_reg[1];
};

#define BYTE_BUILDER1(b0) \
{b0}

#define BYTE_BUILDER2(b0, b1) \
{b0, b1}

#define BYTE_BUILDER3(b0, b1, b2) \
{b0, b1, b2}

#define BYTE_BUILDER4(b0, b1, b2, b3) \
{b0, b1, b2, b3}

#define DEFINE_OPCODE_ARRAY() \
	static struct opcode_definition opcodes[] = {

#define DEFINE_OPCODE_ARRAY_END() \
	};

#define ADD_OPCODE(value, required_val, func_byte_builder, sprefix_size, svalue_type, smay_16_32, is_need_second_reg, sub_reg, sbytes) \
{.val = value, .str_val = #value, .is_required_val = required_val, .build_bytes = func_byte_builder, \
	.prefix_size = sprefix_size, .value_type = svalue_type, \
	.prefix_bytes = sbytes, .may_32 = smay_16_32, .second_reg = sub_reg, .need_second_reg = is_need_second_reg},

DEFINE_OPCODE_ARRAY()
	ADD_OPCODE(AAA, REQUIRED_NO, NULL, 1, VALUE_NO_TYPE, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x37))

	ADD_OPCODE(AAD, REQUIRED_NO, NULL, 2, VALUE_NO_TYPE, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER2(0xd5, 0x0a))

	ADD_OPCODE(AAM, REQUIRED_NO, NULL, 2, VALUE_NO_TYPE, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER2(0xd4, 0x0a))

	ADD_OPCODE(AAS, REQUIRED_NO, NULL, 1, VALUE_NO_TYPE, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x3f))

	ADD_OPCODE(ADC, REQUIRED_VAL, NULL, 1, RM8_R8, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x10))
	ADD_OPCODE(ADC, REQUIRED_VAL, NULL, 1, RM16_R16, MAY_16_32_BITS, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x11))
	ADD_OPCODE(ADC, REQUIRED_VAL, NULL, 1, R8_RM8, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x12))
	ADD_OPCODE(ADC, REQUIRED_VAL, NULL, 1, R16_RM16, MAY_16_32_BITS, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x13))
	ADD_OPCODE(ADC, REQUIRED_VAL, NULL, 1, AL_IMM8, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x14))
	ADD_OPCODE(ADC, REQUIRED_VAL, NULL, 1, AX_IMM16, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x15))
	ADD_OPCODE(ADC, REQUIRED_VAL, NULL, 1, RM8_IMM8, MAY_NO, REQUIRED_SECOND_REG, BYTE_BUILDER1(0x02), BYTE_BUILDER1(0x80))
	ADD_OPCODE(ADC, REQUIRED_VAL, NULL, 1, RM16_IMM16, MAY_16_32_BITS, REQUIRED_SECOND_REG, BYTE_BUILDER1(0x02), BYTE_BUILDER1(0x81))
	ADD_OPCODE(ADC, REQUIRED_VAL, NULL, 1, RM16_IMM8, MAY_16_32_BITS, REQUIRED_SECOND_REG, BYTE_BUILDER1(0x02), BYTE_BUILDER1(0x82))

	ADD_OPCODE(ADD, REQUIRED_VAL, NULL, 1, RM8_R8, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x00))
	ADD_OPCODE(ADD, REQUIRED_VAL, NULL, 1, RM16_R16, MAY_16_32_BITS, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x01))
	ADD_OPCODE(ADD, REQUIRED_VAL, NULL, 1, R8_RM8, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x02))
	ADD_OPCODE(ADD, REQUIRED_VAL, NULL, 1, R16_RM16, MAY_16_32_BITS, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x03))
	ADD_OPCODE(ADD, REQUIRED_VAL, NULL, 1, AL_IMM8, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x04))
	ADD_OPCODE(ADD, REQUIRED_VAL, NULL, 1, AX_IMM16, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x05))
	ADD_OPCODE(ADD, REQUIRED_VAL, NULL, 1, RM8_IMM8, MAY_NO, REQUIRED_SECOND_REG, BYTE_BUILDER1(0x00), BYTE_BUILDER1(0x80))
	ADD_OPCODE(ADD, REQUIRED_VAL, NULL, 1, RM16_IMM16, MAY_16_32_BITS, REQUIRED_SECOND_REG, BYTE_BUILDER1(0x00), BYTE_BUILDER1(0x81))
	ADD_OPCODE(ADD, REQUIRED_VAL, NULL, 1, RM16_IMM8, MAY_16_32_BITS, REQUIRED_SECOND_REG, BYTE_BUILDER1(0x00), BYTE_BUILDER1(0x83))

	ADD_OPCODE(AND, REQUIRED_VAL, NULL, 1, RM8_R8, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x20))
	ADD_OPCODE(AND, REQUIRED_VAL, NULL, 1, RM16_R16, MAY_16_32_BITS, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x21))
	ADD_OPCODE(AND, REQUIRED_VAL, NULL, 1, R8_RM8, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x22))
	ADD_OPCODE(AND, REQUIRED_VAL, NULL, 1, R16_RM16, MAY_16_32_BITS, REQUIRED_SECOND_REG, 0, BYTE_BUILDER1(0x23))
	ADD_OPCODE(AND, REQUIRED_VAL, NULL, 1, AL_IMM8, MAY_NO, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x24))
	ADD_OPCODE(AND, REQUIRED_VAL, NULL, 1, AX_IMM16, MAY_16_32_BITS, REQUIRED_NO_SECOND_REG, 0, BYTE_BUILDER1(0x25))
	ADD_OPCODE(AND, REQUIRED_VAL, NULL, 1, RM8_IMM8, MAY_NO, REQUIRED_SECOND_REG, BYTE_BUILDER1(0x04), BYTE_BUILDER1(0x80))
	ADD_OPCODE(AND, REQUIRED_VAL, NULL, 1, RM16_IMM16, MAY_16_32_BITS, REQUIRED_SECOND_REG, BYTE_BUILDER1(0x04), BYTE_BUILDER1(0x81))
	ADD_OPCODE(AND, REQUIRED_VAL, NULL, 1, RM16_IMM8, MAY_16_32_BITS, REQUIRED_SECOND_REG, BYTE_BUILDER1(0x04), BYTE_BUILDER1(0x83))
DEFINE_OPCODE_ARRAY_END()

опкоды и формат инструкций описаны в мануалах к процессорам и куче всякой такой литературы.

не занимайтесь х..ней.

alysnix ★★★
()
Ответ на: комментарий от alysnix

Так. Вы наверное не совсем поняли что я имею ввиду. Заполню тогда брешь в вашем недопонимании.

У меня есть книга, документация по процессору intel i386 со всеми инструкциями и их опкодами. Этот анализ я и хотел провести. Я как-то делал его даже, но не заметил логики. С этой документации я и переписываю опкоды и заполняю свою структуру.

peeruoeso
() автор топика

Я ничего не понял, что надо сделать-то? То ли пишем компилятор, то ли реверс-инженерим процессоры интел, то ли пишем свою ос, то ли закупаем нетбуки для тестирования, то ли пишем свой ассемблер, то ли свою реализацию си, то ли свой язык программирования. И в конце куча кода на разбор читателю.

Ну хорошо, допустим пытаемся представить все инструкции процессора в виде удобной структуры. Что подразумевается под «увидеть логику»? i386 это уже куча легаси со времён оригинального x86. Здесь можно глубоко и надолго закопаться исследуя набор инструкций, и найти почему эта здесь так закодирована, а другая так. Но это скорее исследование истории.

neumond
()
Ответ на: комментарий от neumond

Что подразумевается под «увидеть логику»?

Есть ряд команд в intel, а всего их 8, которые образуют под собой логику. Можно даже небольшой парсер написать, который упрощает обнаружение, какая написана инструкция.

Почему их 8 всего, потому там требуется как раз заменить один регистр в опкоде на (от 000b до 111b), так и получается, что их 8. Одна из них, это инструкция ADD. Можете убедиться, что есть в них логика, если взгляните на две инструкции.

Pic0

Pic1

Здесь логика опкода поделена на несколько частей.

00 000 000 - ADD, так как вторая часть равна нулю 000

00 010 000 - ADC, так как вторая часть равна двум 010

Pic2

Здесь 00 111 000 - CMP, так как вторая часть равна 7.

Все эти вторые части соответствуют числам после 0x8X, которые приводятся в документации.

Я только это сумел разобрать.

peeruoeso
() автор топика
Последнее исправление: peeruoeso (всего исправлений: 1)

Мне кажется, ты ищешь закономерность там, где её может и не быть. Опкоды дело такое, они добавлялись исторически в несколько приёмов.

Проще и надёжнее табличку соответствия сделать.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

А такой код как у меня, который я привел. Если показать на собеседовании, даст ли какой-то положительный результат, или работодателю нужно, чтобы было всё сложно и непонятно и что только эксперт может разобраться в коде?!

Просто я видел код компиляторов ассемблера и там как-то ну уж сложно для моего понимания всё написано было. Хотя и понятно, что это оттачивалось годами и скорее всего на первых порах код был проще.

peeruoeso
() автор топика
Ответ на: комментарий от peeruoeso

нафиг ты кому сдался со своим хидером для команд i386? можно только понять, что ты приблизительно знаешь си в части макросов.

кому нужен твой «компилятор» или твоя «ос». ты сначала книжки по компиляторам и конструированию ос сначала почитай.

куда ты хочешь вообще наниматься-то? писать компиляторы? это мало кому нужно, и без тебя писателей найдется. писать ос? этим студенты в университетах занимаются. но им сначала профессора рассказывают - как это делается.

alysnix ★★★
()
Ответ на: комментарий от alysnix

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

кому нужен твой «компилятор» или твоя «ос». ты сначала книжки по компиляторам и конструированию ос сначала почитай.

Здесь думаю, что лучше решать задачу так, и читать и конструировать ОС, так как я читал про устройство ОС книгу, но не дочитал, так как понял, что эти знания нужно применять, а значит, что надо написать компилятор для того, чтобы продолжить работу над своей ОС.

нафиг ты кому сдался со своим хидером для команд i386? можно только понять, что ты приблизительно знаешь си в части макросов.

Я хотел показать, не кажется ли такой код гавнокодом перед работодателем, ведь я не использую какие-то сложные махинации в коде, а делаю только банально большой массив структуры, где каждый элемент обозначен.

куда ты хочешь вообще наниматься-то? писать компиляторы? это мало кому нужно, и без тебя писателей найдется.

Это для себя и для резюме. Дело в том, что мне надоели простые задачи, а задачи которые требуются для бизнеса, на C почти нет. Уже возраст не тот, чтобы переучиваться на другой язык и менять свое мировозрение насчет заработка, так что я просто сижу дома и пишу то, что интересно. Также я пишу эмулятор NES, который мало кому нужен, но это показывает, что я люблю сложные задачи. Вообще, я хочу углубиться в embedded разработку, но пока осваиваю около-embedded темы.

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

peeruoeso
() автор топика
Ответ на: комментарий от peeruoeso

хочешь ембеда - забей на все эти свои ос, и свой компиляторы.

берешь си, берешь какую-нить платку на микроконтроллере, и делаешь себе ембед какой хочешь. начиная от автоматизации курятника, до автополива травки-борзянки.

это куда полезней, для тебя и потребителя, чем «своя ос и компилятор». своя ос и компилятор - это понты для молокососов.

alysnix ★★★
()
Ответ на: комментарий от alysnix

хочешь ембеда - забей на все эти свои ос, и свой компиляторы.

Ну тут я вашего совета уже не спрашивал, я только про код интересовался. Будьте по приличней и не втягивайтесь учить меня как жить, пожалуйста.

берешь си, берешь какую-нить платку на микроконтроллере, и делаешь себе ембед какой хочешь. начиная от автоматизации курятника, до автополива травки-борзянки.

Я не хочу делать банальные вещи. Первое, что я хочу реализовать, это перенести мой эмулятор на arduino, который будет работать по SPI с SRAM и другими компонентами, такими как card reader и LCD экраном. Но для этого мне надо подучить электронику и найти денег, чтобы мне собрали схему, которую я создать в Kicad.

это куда полезней, для тебя и потребителя, чем «своя ос и компилятор». своя ос и компилятор - это понты для молокососов.

Польза для каждого может быть своя. Вот вы не видите в этом смысла, и думаете, что знаете жизнь лучше меня и что нужно потребителю. У вас наверное свой бизнес да?

Хорошо, избегайте пожалуйста резких заявлений в мою сторону пожалуйста, у меня психическое заболевание и я возможно буду испытывать трудности в засыпании, так как будут флэшбеки врезаться в воображение.

Лучше обходить таких фраз, как «зачем это тебе нужно или кому-то вообще»? Это походит на НЛП, которые вы используете и сами того не подозревая, ведь вы можете мне разрушить цель и я буду заниматься не тем, о чем мечтал. Ваша грубая манера общения дает мне представление, будто вы не очень культурный человек, что конечно же за собой следует ряд негативных эмоций, которые бы я мог проявлять, если бы мой эмоциональный интеллект был ниже, чем сейчас.

Я думаю, что достаточно опытен, чтобы выбирать что мне создавать, а что нет. Я всего лишь спрашивал насчет кода компилятора. Если есть что по коду сказать, то скажите. Но так как вы не эксперт в анализе процессора, то мне приходится читать от вас какие-то манипулятивные тексты.

peeruoeso
() автор топика
Ответ на: комментарий от peeruoeso

Я всего лишь спрашивал насчет кода компилятора. Если есть что по коду сказать, то скажите

компилятор (асм) должен открыть файл, читать его, разделяя поток на лексемы, проверять лексические и синтаксиеские правила,
делать инклуды внешних файлов, анализировать макросы, запоминать определямые символы, раскрывать макроподстановки, читать инструкции, генерить их бинарное представление, составлять кодовые и прочие секции, генерить выходной файл некоего формата и проверять корректность всего этого,…это навскидку. и это не полстранички кода.

ну и где у вас компилятор-то? у вас 100 строк си макросов, для некоего подмножества неких асм команд.

вот напишите, что я перечислил, тогда и приходите с вопросами… впрочем тогда и вопросов не будет.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

вот напишите, что я перечислил, тогда и приходите с вопросами… впрочем тогда и вопросов не будет.

Вы не понимаете. Пожалуйста, прислушайтесь ко мне. Я компиляторы уже писал ассемблера. У меня есть готовый ассемблер, похожий на 16 битный, но он генерирует байткод. Зато это подходит для игр, где требуется, чтобы код генерировался не в файл, а в буфер. Также есть эмулятор такого байткода. Я умею делать компиляторы ассемблера, но они вот такие получаются, что я заношу каждый опкод в массив, когда как мне кажется, что истинный программист, который знает хорошо устройство процессора, может написать более сложный код. Как видите, в конце я использую структуру массив, в которую добавляю каждую команду, но я не помню, чтобы видел где-то такое же в коде у других крутых разработчиков.

Поэтому я обременен желанием выяснить, хоть такой код и понятный даже начинающему, не выглядит ли он как говнокод.

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

Link0

Link1

Ох блин, как же трудно вам объяснить, что я хочу. Надеюсь теперь вы поняли, что я спрашиваю по части логики построения опкодов? Ведь можно было бы разбить на enum некоторые команды и генерировать код, делая код на вид более сложным. Хотя такое я буду делать, когда понадобиться написать приложение для реверса.

А впрочем, раз уж вы не поняли сразу, то думаю, что не понимали вопроса, потому что у вас не хватает компетенций. Извините, что отнял у вас столько драгоценного времени, которое вы потратили впустую.

peeruoeso
() автор топика
Ответ на: комментарий от peeruoeso

Если показать на собеседовании, даст ли какой-то положительный результат

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

Просто я видел код компиляторов ассемблера и там как-то ну уж сложно для моего понимания всё написано было

«Компилятор ассемблера» пишется за несколько дней при желании. Для i386 так уж точно. Видимо системное программирование - не твоё, займись чем-нить другим.

Хотя у меня подозрение что ты вообще тролль.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

«Компилятор ассемблера» пишется за несколько дней при желании. Для i386 так уж точно. Видимо системное программирование - не твоё, займись чем-нить другим.

Вы правы, в системном программировании я более слаб, чем пользовательском. Но, ваши советы бросить это дело, черезчур агрессивны. Если я поставил цель в этом развиваться, то значит надо развиваться. Будьте добрее насколько это вообще возможно.

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

Опишите как бы вы строили структуру опкодов или как бы вы обошлись без структуры? А то, я только знаю как по своему делать, а разбираться в чужом коде, то же самое, что копировать его, а это ещё скучнее, чем если сам придумываешь.

Какой у вас бэкграунд в данном направлении?

peeruoeso
() автор топика
Последнее исправление: peeruoeso (всего исправлений: 1)
Ответ на: комментарий от firkax

Это помогает в парсинге. В предыдущем компиляторе это спасало. Я заполнял разными данными, которые определяли инструкцию и парсер мог сразу понять как работать с таким кодом.

Если вы говорите, что это лишняя сущность, то как ещё определить какие инструкции какой код генерируют?

peeruoeso
() автор топика
Ответ на: комментарий от firkax

Вот на gitverse есть код моего компилятора байткода. Там я тоже инструкции записывал в массив структур. Хоть код получается сложноватым в парсинге, но на деле, если знать, то можно спокойно добавить любую инструкцию. Там есть несколько веток, одна для игры про лифты, другая для военной стратегии.

peeruoeso
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Вас так удивляет, что я культурно общаюсь на этом форуме? Просто у меня тяжелая жизненная ситуация, и единственное что я могу делать в радость, это работать над кодом. Я бы избегал негатива, так как это плохо сказывается на моем состоянии. Пусть, даже, хоть здесь и бывает токсичный народ, но это не определяет всех здесь присутствующих, так как я знаю, что те, кто начитан, или хотя бы учились в вузе, будут более дружелюбными в общении, так как их интеллектуальный уровень должен быть выше, чем у тех, кто не может справиться со своим низким уровнем эмоционального интеллекта.

Да что там говорить, у меня долгое время был низкий уровень EQ, и я часто срывался. Сейчас же работаю над его улучшением, чтобы быть более сильным в плане эмоций.

peeruoeso
() автор топика
Ответ на: комментарий от peeruoeso

Если ты под «структурой» имеешь ввиду это:

00 000 000 - ADD, так как вторая часть равна нулю 000
00 010 000 - ADC, так как вторая часть равна двум 010
Здесь 00 111 000 - CMP, так как вторая часть равна 7.

То это называется «система команд», она описана в мануале по процу, пытаться её самостоятельно выводить из каких-то обрывочных сведений незачем.

firkax ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Да, тоже такое впечатление появилось почти в самом начале, но не 100%.

firkax ★★★★★
()
Ответ на: комментарий от firkax

То это называется «система команд», она описана в мануале по процу, пытаться её самостоятельно выводить из каких-то обрывочных сведений незачем.

Это я хотел оставить для программы по реверсу, или отладчику, который бы по опкоду определял какая команда и писал её. Да, это система команд. А что вы хотите сказать под этим текстом?

пытаться её самостоятельно выводить из каких-то обрывочных сведений незачем

Там вроде всё ясно какая инструкция будет на текущем опкоде, но не всё поддается логике.

Но как тогда можно писать компилятор, ведь к каждой инструкции всё равно надо присвоить байты, которая она генерирует. Вот это мне не понятно. Если вы говорите, что мой код плох, то какой тогда хороший код? Ведь я создаю такой массив структур, что парсер потом с легкостью сможет понять какие байты генерировать.

Я, по обычаю сам пытаюсь додуматься, но иногда неплохо бы спросить о том, как это делают профессионалы. Раньше я заглядывал в код компиляторов и там сложно было понять что и как. Поэтому решил своим умом делать.

peeruoeso
() автор топика
Ответ на: комментарий от Obezyan

Я пришел к выводу, тем более, что никто до сих пор не дал ясного ответа, что анализ опкода лучше проводить для реверса, а если компилятор, то делать массив структур соответствий к каждой инструкции.

peeruoeso
() автор топика

у меня есть желание делать свою ось, чтобы кайфовать от процесса

Ну, если у тебя от такого кайф вырабатывается, то это только плюс. У человека может быть тысяча причин писать свою ОС, начиная от желания понять, как оно работает, и заканчивая попыткой вырваться из надоевшего треугольника ОС, две из которых проприетарные.

Но чтобы избежать совсем уж велосипедостроения, предлагаю для начала почитать wiki.osdev.org, там много полезного. Потом можно потыкать, какие есть проекты за пределами мейнстрима, вдруг тебе захочется присоединиться к одному из них?

Лично я свою чесалку удовлетворил, узнав про Embox, например. Противоположный пример – GNU Hurd: интересно, как могла бы выглядеть операционная система, идейно близкая к линуксу, но построенная на микроядре.

Если ничего из этого интересным не покажется, пиши свою. Только поиски скрытых закономерностей в опкодах процессоров, мне кажется, неплодотворное занятие. Их действительно лепили из полуинженерных, полуисторических соображений. К тому же и процессорных архитектур с совершенно разными опкодами сейчас сильно больше одной, на дворе давно не 1999 год. Делать себя заложником интела или, наоборот, АРМа… не знаю, лично мне это неинтересно. Я вот потихоньку копаю прикладное программирование, но если вдруг решу заняться системным (вряд ли, но…), думаю, это будет что-то на основе одного из уже существующих проектов под свободными лицензиями. Сделать что-то полезное или даже прикольное, стоя на плечах гигантов — это тоже неплохо.

hobbit ★★★★★
()
Ответ на: комментарий от peeruoeso

Приветствую. Логика подсказывает, что логика должна быть, но скорее всего прямолинейная для взгляда на коды комманд она осталась где нибудь году в 1986. Сейчас, наверное, чтобы её отследить нужно смотреть сразу и на опкоды и на их микрокод и может быть ещё схему процессора заодно.

Как то сложно. Это нельзя через мапу сделать? Должна же быть такая вещь в C. Или вот еще массив строк где индексы от первого опкода до последнего, а в качестве элементов асмеблерная команда. Эту мапу или массив из файла читать. Вот defineы и исчезнут.

areful
()
Ответ на: комментарий от hobbit

К тому же и процессорных архитектур с совершенно разными опкодами сейчас сильно больше одной, на дворе давно не 1999 год.

Да нет, всё так же одна.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Не знаю что за «структуры опкодов» ты пытаешься придумать, это какая-то лишняя сущность.

Как я понял, он пытается определить закономерность. Типа вот такая группа команд начинается с таких вот бит, и это может помочь оптимизировать транслятор.

Лично я считаю идею сомнительной, о чём и написал выше.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от Obezyan

Я не нашел в интернете что такое EOS token. Что значит у моей сети? Нейросети? Если вы думаете, что я нейросеть, то, хаха, сейчас объясню. Объясню, чтобы пропало такое мнение насчет того, что я не способен отвечать и писать тексты без нейросети.

Чтобы достичь того, что я пишу, я перестал бывать на токсичных общухах. Так как я перестал общаться с теми, кто негативен, и стал общаться с теми, кто позитивен, то уровень диалога и эмоций дали свой результат. Мне понравилось общаться в доброжелательном ключе.

Сейчас объясню почему я вообще хочу написать ОС, компиляторы и другие вещи. Хоть и понятно, что меня вынуждают на объяснения, но в целом, я даже делюсь на своей странице своими результати, например по эмулятору NES. vk

Может на моё общение также повлияло чтение книг, которые мне очень нравились и захватывали меня на целые дни. Бывало, что я даже ничего кроме чтения книг за целый день, я больше ничего не делал. Хоть я и понимаю, что у молодежи больше общение проходит в коротких сообщениях и ярких высказываниях, но я больше стараюсь, если и делаю высказывания, то хочу, чтобы они способствовали позитивному настрою или даже вдохновили на создание чего-то грандиозного.

Так как я не работаю, то у меня полно свободного времени. Так как я не учился в вузе, я хотел бы познать computer science, даже если нет возможности учиться. Меня мотивирует то, что я хочу стать экспертом в нескольких областях компьютерных наук. В целом я стремлюсь к этому, потому что другого ничего не остается и вся моя жизнь построена на обучении до самой старости. Я рад, что хотя бы такой исход меня ждет в ближайшие годы.

peeruoeso
() автор топика
Ответ на: комментарий от areful

Как то сложно. Это нельзя через мапу сделать? Должна же быть такая вещь в C. Или вот еще массив строк где индексы от первого опкода до последнего, а в качестве элементов асмеблерная команда. Эту мапу или массив из файла читать. Вот defineы и исчезнут.

В C нет map. Через define я просто скрыл объявление структуры. Я дошел до того, что для каждой инструкции нужно знать несколько параметром. map может хранить структуру с этими параметрами, думаю, но map нет и я построил обычный массив.

Что я вынес из этого? Для определения инструкции нужно его имя, размер в байтах, сами байты, есть ли дополнительный регистр, как например у 0x80 ADD и других, который относятся к базовым вычислениям. Размер операнда также необходимо знать, потому что на одном опкоде может быть два размера, 16 или 32 бита. 32 бита будет, если перед этим опкодом будет 0x66 байт, тогда он сигнализирует, что инструкция не 16 битная, а 32 битная.

peeruoeso
() автор топика
Ответ на: комментарий от hobbit

Как я понял, он пытается определить закономерность. Типа вот такая группа команд начинается с таких вот бит, и это может помочь оптимизировать транслятор. Лично я считаю идею сомнительной, о чём и написал выше.

Да, я хотел определить закономерность, но она больше подходит для простого дизассемблера, чтобы сократить количества кода и выпендриться, что я знаю хорошо систему команд процессора.

peeruoeso
() автор топика
Ответ на: комментарий от peeruoeso

сократить количества кода и выпендриться

Боюсь, со вторым тут получится лучше, чем с первым. :)

Ну а про «знаю хорошо систему команд» я уже написал выше. Я когда-то знал почти наизусть систему команд i8080 (С3 и C9 помню до сих пор), не спорю, когда под рукой были исключительно деривативы Радио-86РК, это сильно помогало. Но в 2025 году уже как-то неохота свой чердак этим забивать. Попадёт в руки RISC-V или даже куда более банальный ARM – и все интелоспецифичные знания идут лесом.

hobbit ★★★★★
()
Ответ на: комментарий от peeruoeso

Там вроде всё ясно какая инструкция будет на текущем опкоде, но не всё поддается логике.

Похожие команды с одинаковым синтаксисом и байтовым представлением есть арифметика (add/or/adc/sbb/and/sub/xor/cmp), сдвиги (rol/ror/rcl/rcr/shl/shr/-/sar) и условные переходы (Jxx, их целых 16). Они появляются наборами в ряде мест, но не везде присутствуют полным списком, а в некоторых местах вроде есть и по отдельности. Все остальные инструкции расположены как попало, закономерностей искать не надо, ну разве что push/pop обычно рядом и inc/dec тоже.

Что касается вообще байтового представления, то операнды в памяти с косвенной адресацией везде кодируются одинаково (mod+r/m) и часто комбинируются с номером регистра в средних трёх битах, но это уже другое.

Все описанное - скорее наследие процессора 8086, он был сделан на относительно простых логических схемах и сложности в системе команд бы усложнили и сам проц. Никакой строгой логичности не было даже в те времена, а в 32-битных или, хуже того, 64-битных асмах и подавно.

firkax ★★★★★
()

Мне нравится этот подход, нумерология в разрезе системы команд i386. гадание по опкодам, вот это вот все

Я если правильно понял оп хочет на основе своей структуры opcode_definition написать универсальый генератор двоичного кода, жругих идей зачем это нужно нет

shimshimshim
()
Последнее исправление: shimshimshim (всего исправлений: 1)
Ответ на: комментарий от hobbit

Ну а про «знаю хорошо систему команд» я уже написал выше. Я когда-то знал почти наизусть систему команд i8080 (С3 и C9 помню до сих пор), не спорю, когда под рукой были исключительно деривативы Радио-86РК, это сильно помогало. Но в 2025 году уже как-то неохота свой чердак этим забивать. Попадёт в руки RISC-V или даже куда более банальный ARM – и все интелоспецифичные знания идут лесом.

Да вы просто развитый уже, я же ещё развиваюсь. Так как я хочу написать компилятор высокого уровня для своей ОС со своим форматом файлов, то нужно сначала и компилятор написать, который бы подходил для той системы, на которой я хочу его запустить. Для этого я взял asus eee pc 700, он очень простой, на нем всего 2 гига ssd. Думаю, чтобы дать ему жизнь, то взяться за разработку своей ос. Компилятор, если на то потребуется время, сделаю и для других платформ. Пока же, я хочу, чтобы запустилось хотя бы на этом древнем нетбуке. Ну и задачу надо брать в начале более простую, чтобы осилить её, а дальше только усложнять.

peeruoeso
() автор топика
Ответ на: комментарий от peeruoeso

32 бита будет, если перед этим опкодом будет 0x66 байт, тогда он сигнализирует, что инструкция не 16 битная, а 32 битная.

Это только в досе так. В 32-битных системах наоборот: 0x66 чтобы сделать 16-битный режим. А в 64-битных ещё больше бардака.

firkax ★★★★★
()
Ответ на: комментарий от Obezyan

В бошке, нельзя так писать и не быть на препаратах.

Вы не понимаете мою ситуацию. Я на препаратах, но на тех, которые не меняют сознание, так как не люблю, когда сознание искажается, люблю трезвый образ жизни. А что до того, что я так пишу, так это либо книги, либо моя болезнь по шизофрении, но в целом, люди стали отмечать, что чтение книг дает результат к более хорошему изложению своих мыслей. А что значит так писать, я плохо пишу для обычного гражданина? Или для молодежи? Может я хочу быть более вежлив, чтобы сохранить за собой право порядного человека. Это дает мне плюс, так как я лучше себя чувствую и буду знать в старости, что сохранял добродетель в свои былые годы и никто не пострадал.

peeruoeso
() автор топика
Ответ на: комментарий от shimshimshim

ошибка компиляции по причине: ваш процессор скорпион.

Obezyan
()
Ответ на: комментарий от Obezyan

не слежу за всеми пациентами на ЛОРе, спасибо за уточнение.

Надеюсь это не делает вас относиться ко мне более пренебрежительно только за то, что у меня есть болезнь? А то вы так пишете, что я пациент, будто я у вас лечение прохожу.

peeruoeso
() автор топика
Ответ на: комментарий от shimshimshim

Я если правильно понял оп хочет на основе своей структуры opcode_definition написать универсальый генератор двоичного кода, жругих идей зачем это нужно нет

А как тогда сделать? Предыдущий компилятор работает хорошо и это видно на видео, которые я скидывал выше. opcode definition нужен для реверса, а для компиляции нужен другой подход, как я понял и раньше.

peeruoeso
() автор топика
Ответ на: комментарий от hobbit

Самая главная цель, стать экспертом в computer science. И занимаюсь то тем, то тем, чем судьба дает сегодня заниматься, тем и занимаюсь.

Насчет ОС строения, у меня есть книга, я хочу, читая её, попытаться своё написать, чтобы не было такого, что я заглядываю в чужой код. Также происходит и с эмулятором. Метод чистой комнаты. Есть документация, и я, который пытается по ней создать ОС. А если я буду копировать код с сайта, то думаю, что не буду получать полного восхищения от проделанной работы. Мне больше нравиться, когда я долго не могу решить задачу, а потом удается реализовать данный функционал. Тогда я на седьмом небе от счастья, и бывает даже, что неохота больше целый день чем-то заниматься, так как настроение очень хорошее.

peeruoeso
() автор топика
Ответ на: комментарий от peeruoeso

В C нет map.

Прикольно. Так нужно сделать свою реализацию мапы и её использовать. Знание о том как организованы внутри и как работают такие структуры как мапы и листы будут более ценны на собеседовании. Оптимизированная реализация таких структур нужна при написании ОС.

areful
()
Ответ на: комментарий от peeruoeso

А что значит так писать, я плохо пишу для обычного гражданина?

По сравнению с кулинксао, нормально пишете, но он просто дурачится. Я просто отметил у вас ошибки токенизации, не более того.

Вообще, если поиск закономерностей вам помогает то рекомендую перейти от опкодов к кольцам вычетов (полям Галуа) на эллиптических кривых. Там есть интересные паззлы, например: https://privatekeys.pw/puzzles/bitcoin-puzzle-tx

Obezyan
()
Ответ на: комментарий от peeruoeso

Надеюсь это не делает вас относиться ко мне более пренебрежительно только за то, что у меня есть болезнь?

Нет

А то вы так пишете, что я пациент, будто я у вас лечение прохожу.

Пациентами я называю всех участников данного форума, включая себя. К вам лично и к вашей болезни это не имеет отношения.

Obezyan
()
Ответ на: комментарий от Obezyan

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

Думаю, что я не осилю такую математику, ну и сайт не открывается. Посмотрел отзывы, кто-то говорит, что сайт мошеннический, кто-то, что сайт шутливый.

Я пока читаю за 10 класс алгебру, и то не всегда. Хочу освоить то, что забыл, когда учился в вечерней школе. После того, как освою, то можно будет снова переходить на математический анализ, чтобы и его освоить. Но думаю, что алгебра за 10-11 классы поможет уже начать понимать формулы, которые применяются в электронике.

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