LINUX.ORG.RU

Надассемблер

 , ,


3

2

Интересует язык, который тривиально транслируется в ассемблер. По сути если я пишу на ассемблере, то многие паттерны повторяются чисто механически. Можно макросов под них понаписать, но язык это всё же лучше макросов. Но при этом он должен совершенно очевидным образом преобразовываться в ассемблер, в нём должен быть прямой доступ ко всем регистрам, в любой момент должна быть возможность использовать ассемблер напрямую. Но в то же время он должен быть настолько высокоуровневым, насколько это теоретически возможно для языка такого уровня. К примеру объявить переменную определённого типа, которая будет в стеке и к которой будут применяться правильные JMP-команды и арифметика (signed/unsigned).

Я точно не уверен, но вроде бы на заре времён язык C был чем-то подобным. Но речь о современности. В частности интересует конкретно архитектура ARM Cortex M0.

Что хотелось бы видеть по пунктам:

  1. Объявления функций с переменными. Автоматические прологи и эпилоги.

  2. Типизация переменных (signed/unsigned), понятный синтаксис для сравнений, структурированный код (if/while/…) вместо JMP.

  3. Вызов других функций по стандартным конвенциям.

  4. Статический анализ там, где это возможно.

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

★★★★★

Точнее так https://github.com/jossk/c--sphinx

Та ссылка уже устаревшая. А Гугл и не в курсе. Ей место в вебархиве, вместе со страницей на которую она указывает.

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

Не понял, о чём ты.

Я решил, что ты собрался jmp’ать прямо по локальным переменным.

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

Тогда есть смысл пользоваться си и встроенным __asm__.

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

Ну да. В сущности, умение языком Форт создавать вой словарь операторов - на нём можно много, и своих, и уже известных языков программирования создать. Чем он и хорош.

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

И скомпиленный код, что целевым, что объектным компилятором, весьма компактен на выходе. Порой у меня выходил меньше чем на tasm-е.

Язык для его фанатов, но в репозиториях ещё присутствует, во многих дистрибутивах UNIX/Linux.

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

Ага, спасибо! Загуглю и гляну. Может тряхну стариной и на Forth чего нибудь напишу в 2022-м то году. А почему бы и нет.

Диски «библиотека программиста» я все выпуски храню, там на 7 CD есть и много языков, с 94-го года их собираю, и очень много литературы по программированию. От классиков С и С+, K&R и Гербердта Шилдта, и до мало кому известных и по разным языкам программирования.

Диски проверял, читаются прекрасно.

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

Залогинься, друг! Хочу знать кто ты раз говоришь про автоматное программирование Шалыто.

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

В среде FIDO-шников 90-х, она была бестселлером :) Но у В.П.Дьяконова толще книжка и лучше, в твёрдых корках. Вон на полочке стоит, тёмно синяя такая.

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

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

mov r0, #666
не факт что компилятор ее не поменяет на сложение
add r0, r0, #666
я сам это видел, своими глазами. и не надо говорить пожалуйста что такое быть не может.

чем это опасно? когда пишешь на голом железе, да не очень, но если крутиться ОС, которая может хранить что то r0, например возвращаемое значение, и компилятор схватит этот регистр и сделает

add r0, r0, #666
вот так спутники и пролетают мимо марса. Это не мои мысли, это вот человек ,который сейчас рядом и шарит объяснил мне, а я написал вам.

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

А как можно заменить mov на add? Какой в этом смысл? Это же разные инструкции.

Похоже надо свой ассемблер писать.

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

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

mov r0, #666;  в r0 будет лежать 666
что 
add r0, r0, #666; в r0 будет также 666 . но при условии что r0 небыло ничего, то есть ноль. 
так и строится вся их оптимизация, то есть ты пишешь одно, а компилятор делает то что считает нужным. ты пойми, что тот кто пишет компилятор тот и правит балом. и как он захочет так и будет. посчитает он что например
mov r0, #666
лучше заменить на
mov r1, #666
mov r0, r1
то так и сделает. но он просто захочет. и ты не видя что под капотом даже не будешь знать. Вот это и называется оптимизацией. Но они лучше знают типа железо и где и в каких местах надо mov а где его заменить на add. но мы может только гадать какие цели преследовали те кто кто заменяют mov на add в некоторых местах. Гадать не будем ,но факт остается фактом. И спрашивать меня почему так они сделали смысла нет. Если бы я это написал, то я бы тебе объяснил для чего это нужно было. Но так решил не я. поэтому смешно видеть как наши учителя пытаются придумать алгоритмы сортировки к примеру, которые будут быстрее, при этом не подозревая что всю их писанину компилятор перепишет посвоему))))))))))))

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

Ну ладно, предположим.

А в чём вообще смысл этого действа? Все инструкции в любом случае занимают 2 байта и выполняются за один такт. По крайней мере для RP2040 это так. Просто интересно. Или на других ARM-ах это не так?

Всё же пока я не увижу это своими глазами, до конца не поверю. Но спасибо за предупреждение, буду настороже.

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

Это же разные инструкции

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

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

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

Есть известная оптимизация для x86, когда вместо MOV EAX, 0 рекомендовалось писать XOR EAX EAX. Могу представить себе компилятор, заменяющий эти инструкции. Но как ты написал - в любой момент может сработать прерывание, не восстановить регистр (это ведь всего лишь соглашение, а не обязанность) и да, ракета улетит мимо марса.

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

Всё же пока я не увижу это своими глазами, до конца не поверю.

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

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

Ну ассемблер написать дело технически очень простое. Я думал это сделать чисто ради интереса, сейчас ещё больше думаю.

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

что ассемблер таким будет заниматься.

Это не assembler. это вас имеют те кто пишет компиляторы.

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

ассемблер написать дело технически очень простое

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

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

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

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

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

GCC компилятор? когда я делаю

gcc f.c -S
кто будет работать с f.c? кто преобразует файл в f.s?

Компилятором её называть, имхо, не совсем корректно

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

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

В fasm есть ключевое слово signed чтобы указать, что сравнение знаковое. По умолчанию беззнаковое.

То есть там нужно указывать знаковость не переменной, а выражению. Это проще сгенерировать, ведь всего-навсего нужно подменить команду если есть ключевое слово signed.

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

Смотри, я кажется предполагаю, о чём ты говоришь.

Я пишу mov r1, r7

При этом если дизассемблировать файл, то там будет adds r1, r7, #0

Т.е. вместо r1 := r7 он написал r1 := r7 + 0.

Для чего это делается, я пока не понял. Но в любом случае такая оптимизация ничего в поведении программы не меняет. Я спросил на Stack Overflow: Why MOV instruction is replaced by ADD instruction может кто ответит, мне это тоже интересно теперь.

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

кажется предполагаю, о чём ты говоришь

видимо нет потому что

оптимизация ничего в поведении программы не меняет

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

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

mov не меняет флаги, а add меняет. Т.е. по сути меняется mov+test, нет?
Это было предположение.

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

кто тут будет виноват? разработчик компилятора, или ты?

Руководитель проекта. За то, что не организовал сквозную проверку/верификацию функциональных требований во всём используемом софте.

Shushundr ★★★
()

Wasm попробуй. Только не тот, который в вебе, а который был на wasm.ru. Если операторы сравнения и циклов, операторы вызова процедур. При этом пишешь на ассемблере, всё под контролем.

LongLiveUbuntu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.