Сейчас на форуме: Alf, Adler, Rio, vsv1 (+8 невидимых)

 eXeL@B —› Софт, инструменты —› Полноценный C/C++ компилятор
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 14 июня 2016 07:26
· Личное сообщение · #1

Недавно продолжительное время возился с чужим проектом, написанном на сях, и неожиданно для себя увлёкся (сам закоренелый паскальщик). Решил более близко познакомиться с этим языком, но в процессе столкнулся с очень большой проблемой – отсутствием полноценного компилятора. Под полноценностью подразумевается наличие неурезанного встроенного ассемблера. Щупанью подверглись 3 продукта: мелкомягкий, интеловский и поделие от Digital Mars. Первые джва не знают о директиве DB/DW/DD (зато детище MS занимается самодеятельностью в асм-блоке), как следствие не дают возможности создать jump-table (самое смешное, что хаемый всеми багландский компилер не имеет таких ограничений). У последнего нет этого фатального недостатка, но к большому огорчению есть другой – деоптимизация кода левыми инструкциями (не для выравнивания). В общем вопрос такой: существует ли на свете C/C++ компилятор (или может какая-то из версий упомянутых), способный генерить качественный код и обладающий полнофункциональным inline-ассемблером? Я что-то не нашёл.




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 04 июля 2016 13:30
· Личное сообщение · #2

тг/кг/ам...

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 13 июля 2016 01:07 · Поправил: FalseMaster
· Личное сообщение · #3

Вот плохо, что уведомления на мыло не сделать, как всегда забыл о теме… Ну да ладно, она всё-равно себя исчерпала и отписывающиеся скатились в оффтоп. Я просто хотел немного поиграться с Си, но как видно так и помру проклятым паскальщиком К тому же оказалось, что я сильно отстал от жизни – начиная с версии XE в делфийском компилере появились директивы для выравнивания кода (и это ох**нно). Ещё бы реализовали это для данных, кодогенератор довели до ума, да препроцессор добавили, и тогда у сишного компилятора не останется никаких преимуществ.

dosprog

>> Вот те раз. А где ж там Паскаль?

Как это где? В начале проседуры:
Code:
  1. procedure Emu_Step;
  2. asm
, в конце:
Code:
  1. end;
– не вываливать же весь модуль для демонстрации синтаксиса на нескольких строках.

>> И вопрос - вот этот RET, он возврат куда? И откуда?

Очень странный вопрос. На следующую после "CALL" инструкцию вестимо.

>> - Это путь к созданию безнадёжно глючного софта.

Ты так говоришь, потому что привык, что компилятор генерит за тебя половину кода. Но это не труЪ, чувак

>> Кстати, это выглядело отталкивающе ещё в Turbo-Pascal'е - код вперемежку с данными.

Какой ужас. Ну береги тогда свой манямирок от дизассемблеров/дебаггеров, а не то как покажут тебе таблицу переходов, вкоряченную непосредственно (с выравниванием на DWORD) после "jmp dword [<addr> + r32*4]", в скомпиленном твоим любимым MSVC бинарнике.



Ранг: 431.7 (мудрец), 391thx
Активность: 0.730.32
Статус: Участник

Создано: 13 июля 2016 01:16 · Поправил: dosprog
· Личное сообщение · #4

FalseMaster пишет:
Очень странный вопрос. На следующую после "CALL" инструкцию вестимо.


Нормальный вопрос. Потому, что никак нет - возврат будет по тому адресу, который в стеке.
А что там в стеке будет при твоём подходе, это неизвестно никому.

FalseMaster пишет:
Ты так говоришь, потому что привык, что компилятор генерит за тебя половину кода.


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





Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 13 июля 2016 02:51 · Поправил: FalseMaster
· Личное сообщение · #5

dosprog

>> А что там в стеке будет при твоём подходе, это неизвестно никому.

Почему неизвестно-то? Что запихали, то и будет, не? Или ты имеешь в виду порчу стёка при записи в память по кривому указателю? Так от этого компилятор не защитит даже если писать на Си/Паскале без асм-вставок. При таком уровне кодобоязни остаётся только на VB перейти или, ещё лучше, на HTML

>> Да, компилятор этим занимается, приходится это учитывать.

А при моём подходе ничего учитывать не надо (кроме пролога/эпилога). Что на входе, то и на выходе, ня!



Ранг: 431.7 (мудрец), 391thx
Активность: 0.730.32
Статус: Участник

Создано: 13 июля 2016 05:01
· Личное сообщение · #6

FalseMaster пишет:
А при моём подходе ничего учитывать не надо (кроме пролога/эпилога). Что на входе, то и на выходе, ня!

Вот и был задан вопрос, куда будет в приведеном примере ret, не учитывающий пролога.

..
в общем, тема себя изжила





Ранг: 40.9 (посетитель), 8thx
Активность: 0.040.01
Статус: Участник

Создано: 13 июля 2016 06:32
· Личное сообщение · #7

dosprog

>> куда будет в приведеном примере ret, не учитывающий пролога.

Ох и дотошный же ты чел. Возврат будет куда следует, т.к. функция объявлена как register (тип вызова по умолчанию), локальные переменные отсутствуют, и компиляция производится с ключом {$W-} (аналог сишного Oy). Лучше бы в другой теме что-нибудь полезное предложил.


<< . 1 . 2 .
 eXeL@B —› Софт, инструменты —› Полноценный C/C++ компилятор
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати