LINUX.ORG.RU

Ассемблер в Linux для программистов C

 , ,


0

0

Дмитрий Грибенко опубликовал замечательную книгу по синтаксису AT&T.

Эта книга — для людей, которые уже хотя бы немного разбираются в том, как работает железо. Многое ещё не написано (например, машинная арифметика — чистая теория, операции с числами с плавающей запятой на x86 и многое другое). Низкоуровневая работа с железом не освещена вообще, так как ставка сделана на user-mode, а не на kernel-mode.

Для чтения этой книги никаких знаний о Linux не требуется (кроме, разумеется, «как создать текстовый файл» и «как запустить программу в консоли»).

>>> Книга

★★

Проверено: UVV ()
Ответ на: комментарий от Sun-ch

> В бинарный код инструкций.

lol, и это по вашему легче, чем транслировать в asm?

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

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

Ну и насмешил медведка :) Какая связь между стремлением отдельных групп людей к виртуализации и глобализации и микропроцессорами ? Тут помоему как раз все наоборот - процессоры стремятся сделать как можно меньше да и команды попроще (risc) или у вас другие мысли по этому поводу ? :)

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

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

Sun-ch
()
Ответ на: комментарий от KUser

> Ну если я например сделаю функцию, которая превращает в код зашифрованные данные, то наверно и после компиляции придётся работать с ним как с данными, а полученный код как-то компилировать, или исполнять как есть.

А по фигу. В Лиспе всегда компилятор доступен в рантайме.

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

> Вчера читал четыре часа подряд. [...] Ведь многие конструкции, которые в Ассемблере просто естественны в С преподаются как нечто продвинутое ( указатели к примеру).

Спасибо за ваш комментарий.

// Dmitri Gribenko

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

Если так мечтать - тогда уж нада идти дальше - не будет программистов а будет искусственный интеллект который будет программировать сам себя исполняя голосовые команды обычного человека а в перспективе - и мысли :)

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

А что мешает вместо xor ax,ax написать 16-ричный эквивалент данной команды? Компилятору ассемблер не нужен, он замечательно генерит бинарный код.

Sun-ch
()
Ответ на: комментарий от Sun-ch

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

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

Тем что это на порядок сложнее и дольше. Также как генерировать ассемблерный код на порядок сложнее и дольше сишного.

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

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

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

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

KUser
()
Ответ на: комментарий от Sun-ch

> ассемблеров [...] позволяющих эффективно писать многопоточный код, оптимизированный именно под эти чипы.

Ерунду говорите. Во-первых, многопочтоность зависит от "ассемблера" так же, как и кнопка на мобильном телефоне от стандартов GSM. Многопоточность это сервис и функции операционной системы и библиотек поддержки. А во-вторых, эффективность написания кода зависит только от того, кто этот код пишет.

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

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

Sun-ch
()
Ответ на: комментарий от Sun-ch

Да вы тоже куда-то в сторону уходите - core duo - для программиста это два процессора centrino, причем тут вообще многоядерность ?

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

> http://bellard.org/tcc/ должен нарушить ваши представления о компиляторах :)

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

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

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

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

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

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

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

koTuk
()
Ответ на: комментарий от Sun-ch

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

А что, переключением контекста прикладные задачи сами занимаются?

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

Threading Building Blocks - представляет собой С++ библиотеку, позволяющую оптимизировать процесс создания эффективных многопоточных приложений, показывающих более высокие результаты производительности на многоядерных CPU. И вообще далеко не каждый компилятор поддерживает этот гипертридинг и прочие навороты.

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

>Бредишь? Какая разница, скомпилированный или нет? Скомпилирует модифицированное выражение заново.

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

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

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

Для справки: в x86 процессоре и так есть "такая команда" (скорее "такой механизм"). Только уж очень медленная, поэтому скопировать регистры в ядре на порядок быстрее.

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

> Небольшие ассемблерные вставки бывают очень полезны.

Ассемблер вреден. Он лишает программы кроссплатформенности.

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

> Такие люди как, Hindley J.R., Seldin J.P. , H.B. Curry никогда не видели микропроцессора.

Вот ты, Саныч, процесор видишь? - Нет. - И я не вижу. А он есть!

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

ух ты!!! TASM под линух - круто!

anonymous
()

Отличная работа! Спасибо.

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

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

Вы только что опровергли существование Лиспа. У Луговского ВНЕЗАПНО пропали макры и метапрограммирование.

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

http://zeelanna.blogspot.com/2007_12_01_archive.html

6 Декабрь 2007 г.
Словарь нанопрограммиста (по алфавиту )।
Словарь нанопрограммиста (по алфавиту ) ।

Предисловие переводчика.
Современные компьютерные системы несколько отстают по устройству от биохимических процессов. Надо наверстывать. :-)

апоптоз - встроенный ограничитель дублирования।
белки - функции ядра।
биохимическое превращение - процес работы ПЛИС с информацией।
боковые радикалы - теги функций।
вандерваальсовые связи - присвоение указателей।
генетический код - хеш опкодов।
гомологическая рекомбинация - применение генетических алгоритмов для двойного аппаратно-программного кода (код из двух взаимодополняющих частей - описанием аппаратной части (HDL) и математической (язык программирования))।

ignat

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

делеция - удаление нескольких полбайтов (нуклеотидов)। денатурация - повреждение геометрии(топологической связанности ферментов или коферментов) ДППЛИС। ДНК - компилятор। ДППЛИС - Динамическая Псевдоассемблерная ПЛИС। злокачественные новообразования - последствия деструктивных вирусов, которые работают на основе обратной транскрипции। изменение информационного содержания молекул ДНК - программирование компилятора। имуннохимический метод - способ (часто практикуемый некотрыми организациями) создания функций детектирования вирусов। Основан на выпуске вируса и ожидания от сообщества свободных программистов функций детектирования। В последствии эти функции используются в коммерческих антивирусных пакетах। инициация - зацепление первого тега нужной цепочки функций। инсерция - вставка дополнительных полбайтов। интроны - отработанные в процессе проектирования (автоматического) версии кода подлежащие удалению। каскад ферментов - архитектура ПЛИС периферийными наносборочными манипуляторами। кодон - трит। конформация - топологическая связанность структур। конформация белка - развёртывание функции на прекомпиляторе। конъюгирование - гомологическая рекомбинация двух удалённых систем через среду передачи (напр: internet)। кофакторы - переносчики зарядов (электронов, йонов, колебания кристаллической решётки)। кофермент - стандартное устройство на ПЛИС типа триггер, инвертор। кофермент А - регистр।

ignat

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

кросинговер - гомологическая рекомбинация двух кросскомпиляторов।
лиганды - массив аргументов функций и дефайны (дерективы прекомпилятору)।
молекула - пакет।
молекулярная селекция нуклеиновых кислот - проектирование на Verilog AMS।
мРНК - (м - месседжер) псевдоасемблер।
мутаген - отклонённый patch ядра, который тем не менее используется на некоторых локальных устройствах।
НАД(никотинамидадениндинуклеотид) - двоичный сумматор।
направленный конформационный переход - настройка функций ядра дифайнами(конформация белка) или аргументами функции или полиморфизм в ООП।
нетранскрибируемые участки ДНК - терминалы в компиляторе।
нуклеотид - половина байта।
обратная транскрипция - реверсинжиниринг। Или синтез из аппаратных функций кросскомпилятора псевдоассемблера।
олигонуклеотид - заголовок и концовка объектного кода।
организм - устройство।
процессинг - линковка।
радикалы - элементы структуры типа usb_device->driver_data, они же лиганды।
ренатурация - восстановление геометрии ДППЛИС।
рибозимы - ПЛИС с перепрограммируемой архитектурой записанной на псевдоасемблере।
рибосомы - дистрибутив для кросскомпиляции। В него входят скрипты и функции ядра (рРНК и белки)।
ревертаза - автоматический скрипт под псевдоассемблер для генерации кросспсевдоассемблера или кросскомпилятора।
репарация ДНК - самоавтопроверка кода по стандарту высшего ५ уровня безопасности США।
репликация - копирование।
рРНК - (р - рибосомная) скрипт дистрибутива।
сплайсинг - оптимизация (удаление лишнего) в скриптах сборки (рРНК)।
статистический клубок - вычисление всех необходимых для данных условий видов функций ядра।
субстраты - алгоритмы।
терминация - завершение цепочки функций по сигналу в Псевдоассемлерной ПЛИС।
тетрагидрофолат - триггер।
тРНК - (т-транспортная) кодированный encode код, готовый для передаче।
транскрипция - перевод с псевдоассемблера в машинный код посредством скриптов (или переписывание .config из ядра в директорию usr/linux для сборки)।
транслокация - перемещение всех цепочек внутри базовой Динамической Псевдоассемблерной ПЛИС (ДППЛИС) на одно звено।
трансляция - синтез функций на дистрибутиве сборки।
тридезоксирибонуклеотидный фрагмент - опкод функции ядра।
фермент матричного биосинтеза - наноробот।
ферменты - набор вентилей логических элементов на ПЛИС।
эволюция - ошибки в программе।
экзоны - сохраняемые участки (например ядро системы)।
экспрессия генетической информации - системное программирование।
элонгация - перенос одного звена цепочки функций в кросспревдоассемблер।


Автор ignat на 22:38 0 комментария(ев) Ссылки на это сообщение
Ярлыки: तह्नोलोगिजा इन्फोर्मची

anonymous
()

ITT количество уебанов over 9000

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

> Конечно будет некоторый промежуточный этап, только это будет не ассемблер, человек такое читать не может. Например, система семантических таблиц и иерархии контекстов.

Саныч, этим идеям -- 50 лет в обед. (см. ссылки на http://www.forth.org.ru)

Скажи честно, это ты загрузчик FreeBSD перечитал на ночь, да?

:-)

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

>Вы только что опровергли существование Лиспа. У Луговского ВНЕЗАПНО пропали макры и метапрограммирование.

У скомпилированного языка уже нет макросов и метапрограммирования. Это только байт-код/машинный код. Вы вообще пользовались Лиспом хоть раз?

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

> У скомпилированного языка уже нет макросов и метапрограммирования

Бредишь.

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

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

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

Очнись, ты путаешь компиляцию в машинный код, которая поддерживается практически всеми реализациями, и run-time исполнение (интерпретацию).

Любой интерпретируемый язык может себя изменить (с той или иной степенью проблем), скомпилированный же в машинный код - только простейший код.

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

> Любой интерпретируемый язык может себя изменить (с той или иной степенью проблем), скомпилированный же в машинный код - только простейший код.

Подгрузка кода из другого/соседнего файла может называться "простейший код" и будет ли считается самомодификацией?

:-)

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

> Очнись, ты путаешь компиляцию в машинный код, которая поддерживается практически всеми реализациями, и run-time исполнение (интерпретацию).

Кретин. Нет никакой разницы. Компилируешь и тут же исполняешь, какие проблемы?

> скомпилированный же в машинный код - только простейший код.

Там возможностей рефлекии до хера. Таблица символов всегда доступна. Так что ты можешь подменить СКОМПИЛИРОВАННУЮ реализацию любой функции в рантайме, и все ссылающиеся на неё функции будут пользоваться уже новой, переопределённой версией.

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

>Подгрузка кода из другого/соседнего файла может называться "простейший код" и будет ли считается самомодификацией?

Нет, это неинтересно :) А вот со статическим бинарником уже лучше.

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

>Кретин. Нет никакой разницы. Компилируешь и тут же исполняешь, какие проблемы?

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

>> скомпилированный же в машинный код - только простейший код.

>Там возможностей рефлекии до хера. Таблица символов всегда доступна. Так что ты можешь подменить СКОМПИЛИРОВАННУЮ реализацию любой функции в рантайме, и все ссылающиеся на неё функции будут пользоваться уже новой, переопределённой версией.

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

По твоей логике и это будет самомодифицирующийся код:

(if (eql (get-internal-real-time) 1213702642394526) (format t "qwe") (format t "asd"))

Патамучта мы потом подменим в бинарнике ссылку на format и будет в классе празднег.

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

Нее, вот итинный самомодифицирующийся код:

(defparameter *func* NIL)
(defun test1 (x y) (eql x y))
(defun test2 (x y) (not eql x y))

(setf *func* 'test1)

(funcall *func* 1 1)


А патом мы с пасанами в бинарнике поменяем jmp
с test1 на test2 и будик круто.

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

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