inline assembler gcc

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

inline assembler gcc

Непрочитанное сообщение Olej » 22 дек 2011, 22:16

Попалась мне ссылка по inline assembler компилятора GCC:
http://www.iakovlev.org/index.html?p=1483&m=1

В своё время (и не так давно последний раз) я искал ссылки по этому вопросу, и их не так легко найти.

Я не знаю, кто делал этот перевод, но это лучшее место, что я находил по этому вопросу.
__asm__ __volatile__( "decl %0; sete %1"
: "=m" (my_var), "=q" (cond)
: "m" (my_var)
: "memory"
);
- как говорила старая еврейка: "наконец это пгосто красиво" :lol:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: inline assembler gcc

Непрочитанное сообщение Olej » 28 дек 2011, 02:49

Достаточно трудно найти внятные источники по inline assembler gcc

Вот ещё 2:

1. http://asm.sourceforge.net//articles/linasm.html
Using Assembly Language in Linux.
by Phillip
Last updated: Monday 8th January 2001
2. http://www.delorie.com/djgpp/doc/brenna ... djgpp.html
Brennan's Guide to Inline Assembly
Copyright © 1996 Brennan Underwood.
Но все только перепевают ... кое-какие отдельные примеры.
Внятного понимания что такое констрэйнты? как они образуются? и в каком порядке нумеруются? и почему вот здесь

Код: Выделить всё

asm ("movl %eax, %ebxs");
регистр записывается с одним % ?

Код: Выделить всё

asm ("movl %%eax, %%ebx" : "=b"(myval));

а вот здесь исключительно с двумя %% ?

Это всё интересующимся предстоит выяснять на собственных догадках :!: :twisted:

А это тот синтаксис, на котором написана критическая часть Linux - интерфейс к системным вызовам, и интерфейс этот прописан и отличается для каждой из десятка платформ, поддерживаемых Linux :!:

P.S. И всё таки самые внятные догадки ;-) на эти вопросы даёт книга, в русском издании она выглядит так:
А. Гриффитс, «GCC. Полное руководство. Platinum Edition», Пер. с англ., М.: «ДиаСофт», 2004.
... в которой 5 стр. посвящены синтаксису инлайн ассемблера.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: inline assembler gcc

Непрочитанное сообщение Olej » 29 дек 2011, 21:20

Очень хорошая публикация по сравнению со всеми показанными выше + со всеми что я встречал:
http://opennet.ru/base/dev/gccasm.txt.html

Здесь выжимки не только из полных руководств по GCC, и этого мало... + здесь же некоторые вещи (константы и др.), вытащенные из заголовочных и исходных файлов самого компилятора GCC :!: ... которые, как утверждает автор, забыли вписать в документацию ;-)

Когда начинают разбираться примеры подобные вот следующему:

Код: Выделить всё

#define _set_tssldt_desc(n,addr,limit,type) \
__asm__ __volatile__ ("movw %3,0(%2)\n\t" \
        "movw %%ax,2(%2)\n\t" \
        "rorl $16,%%eax\n\t" \
        "movb %%al,4(%2)\n\t" \
        "movb %4,5(%2)\n\t" \
        "movb $0,6(%2)\n\t" \
        "movb %%ah,7(%2)\n\t" \
        "rorl $16,%%eax" \
        : "=m"(*(n)) : "a" (addr), "r"(n), "ri"(limit), "i"(type))
- начинаешь проникаться :lol:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: inline assembler gcc

Непрочитанное сообщение Olej » 30 дек 2011, 02:37

Olej писал(а):Достаточно трудно найти внятные источники по inline assembler gcc
http://www.ibm.com/developerworks/libra ... index.html
Inline assembly for x86 in Linux
от IBM

А это уже совсем интересно - обсуждения инлайн ассемблирования для других платформ, и, в частности, для embedded архитектур:

- это ARM
http://www.ethernut.de/en/documents/arm-inline-asm.html
ARM GCC Inline Assembler Cookbook

http://balau82.wordpress.com/2011/05/17 ... ns-in-gcc/
Inline assembly instructions in GCC

- это PPC
http://www.wiibrew.org/wiki/Inline_Assembler
Inline Assembler

И что любопытно, все эти публикации конца 2010 - 2011г.г. - вот оно, веяние времени: платформы отличные от Intel x86 ;-)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: inline assembler gcc

Непрочитанное сообщение Olej » 30 дек 2011, 02:51

Olej писал(а):Здесь выжимки не только из полных руководств по GCC
А вот и тот единственный первоисточник, в документации по GCC, в том разделе, который перечисляет все отличия GCC от стандартов C:
http://gcc.gnu.org/onlinedocs/gcc-4.4.1 ... tended-Asm
5.37 Assembler Instructions with C Expression Operands
... эта и ещё пару там следующих там главок ... о констрейтах...
5.38 Constraints for asm Operands
5.39 Controlling Names Used in Assembler Code
5.40 Variables in Specified Registers

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

P.S. и там же, в глубине, я обнаружил уникальную страницу, по объёму большую, чем все остальные названные в сумме :-o :
5.38.4 Constraints for Particular Machines
- объяснения констрейтов, частных для полтора десятка платформ в GCC.
Например, без этой информации смотреть код ядра Linux для других архитектур (x86 просто ещё хоть кой-как описана) просто пустой номер!

P.P.S. Ссылки по этой документации даны по достаточно свежей версии GCC 4.1.1.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: inline assembler gcc

Непрочитанное сообщение Olej » 30 дек 2011, 03:23

Olej писал(а): Но все только перепевают ... кое-какие отдельные примеры.
Внятного понимания что такое констрэйнты?
В содержательном плане тех последних ссылок, что я приводил - достаточно.
ПО смыслу понятно, но решил я глянуть, что дословно означает, а то все русскоязычные тексты: "констрейнты, констрейнты"...

- большинство словарей даёт: принуждение, ограничивающие условие... но это всё как-то горбато :-(

- а вот просто термин из языка Ada:
Перевод с русского на английский в словаре по ВТ и программированию
уточнение
(в языке Ада) constraint,

Вот это оно и есть: уточнение

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: inline assembler gcc

Непрочитанное сообщение Olej » 31 дек 2011, 04:37

Olej писал(а):и почему вот здесь

Код: Выделить всё

asm ("movl %eax, %ebxs");
регистр записывается с одним % ?

Код: Выделить всё

asm ("movl %%eax, %%ebx" : "=b"(myval));

а вот здесь исключительно с двумя %% ?
И это действительно так!
Когда асемблерная вставка записывается без параметров (констрейтов), то вполне проглатывает запись с %, в противном случае - изволь %%.

Сегодня писал (в модуле ядра - 0-е кольцо защиты, супервизор!) подмену системного вызова в таблице sys_call_table (вирусописатели - ау!? :lol: ), так вот таблицу они оказывается, с некоторых пор разместили в сегменте read-only ... и попытка записи нового адреса обработчика (sys_write, например) вызывает ошибку обращения ... Ooops :!:

Но этом делу легко помочь :lol:
- перед записью снимаем защиту по записи в read-only (16-й бит управляющего регистра процессора CR0)

Код: Выделить всё

//код выключения защиты записи:
#define rw_enable()              \
asm( "pushl %eax \n"             \
     "movl %cr0, %eax \n"        \
     "andl $0xfffeffff, %eax \n" \
     "movl %eax, %cr0 \n"        \
     "popl %eax" );
- а после успешной записи восстанавливаем защиту ... чтоб другие не писали :lol:

Код: Выделить всё

//код включения защиты записи:
#define rw_disable()             \
asm( "pushl %eax \n"             \
     "movl %cr0, %eax \n"        \
     "orl $0x00010000, %eax \n"  \
     "movl %eax, %cr0 \n"        \
     "popl %eax" );

Всё замечательно подменяется!

P.S. и регистры то (и какие! ;-) ) с % !

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: inline assembler gcc

Непрочитанное сообщение Olej » 28 фев 2012, 10:08

Olej писал(а):Достаточно трудно найти внятные источники по inline assembler gcc
ВикиУчебник на русском языке:
Ассемблер в Linux для программистов C
Достаточно объёмный и содержательный оригинальный текст по синтаксису AT&T.

bose
Писатель
Сообщения: 107
Зарегистрирован: 23 фев 2012, 14:41
Откуда: Киев
Контактная информация:

Re: inline assembler gcc

Непрочитанное сообщение bose » 28 фев 2012, 17:54

Я тоже попытаюсь пополнить коллекцию на тему Assembler в Linux ( Inline Assembler в частности):
Professional Assembly Language Richard Blum
Изображение
http://www.wrox.com/WileyCDA/WroxTitle/ ... 79010.html

Inline Assembler там уделено целую главу (почти 26 страниц), хотя книга замечательная и без того. Вобщем из серии "MUST TO HAVE"!

PS:
http://cs.karelia.ru/~chistyak/2011/doc ... 77p%5D.pdf

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: inline assembler gcc

Непрочитанное сообщение Olej » 28 фев 2012, 18:45

bose писал(а):Я тоже попытаюсь пополнить коллекцию на тему Assembler в Linux ( Inline Assembler в частности):
Professional Assembly Language Richard Blum
Изображение
http://www.wrox.com/WileyCDA/WroxTitle/ ... 79010.html

Inline Assembler там уделено целую главу (почти 26 страниц), хотя книга замечательная и без того. Вобщем из серии "MUST TO HAVE"!
Очень интересно...
А оттуда же по ссылке - архив кодов примеров:
http://media.wiley.com/product_ancillar ... D/code.tgz
... а вот это как-то мучительно медленно :cry:

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей