LINUX.ORG.RU

Ассемблер под Linux


0

0

Здесь в форумах не искал. Если что - ткните.

Ищу хороший справочник по всем функциям int 80h и если еще какие есть уникальные в Linux.

Интересуют не статьи с введением для тех, кто хочет научиться писать хелловорлд, а именно справочник. Надеюсь, такое чудо есть.

Тебе разве не говорили, что линуксоиды юзают ассемблер только если без него совсем никак? Учи язык Си!

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

посещал. читал. нужен справочник. чем полнее, тем лучше.

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

> А там все нормально разжевано?

Там строчки вида:

#define __NR_unlink 10

10 - это собственно нужный тебе номер вызова. Далее читаешь в man 2 unlink про передаваемые параметры.

RedUser
()
Ответ на: комментарий от vadim-lor

> может быть. для начала надо посмотреть, как оно в асме

нет там кода в асме.

собираешь набор параметров, шлешь либо syscall, либо прерывание (как сделано - не знаю) и ждешь ответа (скорее всего в первом регистре или в регистре возвращаемого значения)

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

Далее читаешь в man 2 unlink про передаваемые параметры.

А в сорсах про параметры ничего? Дело в том, что не для всего есть ман.

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

>только вот эту фразу не понял.

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

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

в результате как разбор, так и упаковка параметров написан на С

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

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

linux изначально пишется кросплатформенным

неправда. ИЗНАЧАЛЬНО он был под x86. и нельзя писаться кроссплатформенным, можно компилироваться под разные архитектуры

поэтому количество ассемблерного кода в его исходниках сведено к разумному минимуму

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

ассемблер используется только там, где без него не получается обойтись

т.е. в низкоуровневом программировании. то, что мне и нужно

vadim-lor
() автор топика
Ответ на: комментарий от namezys

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

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

бр. не понял

ну допустим, параметры передаются так: struct { char a; char b; int c; void *d; }

тогда тебе руками придется вытаскивать. Но для этого надо знать правила выравнивания типов в С коду

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

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

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

или я не так понял. откуда вытаскивать?

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

ты думаешь там в регистры все пихается? очень в этом сомневаюсь: обычно проще все упаковать в одну структуру и отправить ее в ядро. Тем более при этом придется меньше сохранять регистров в стеке. Но надо смотреть документацию.

это не дос, где параметры передавались в регистрах

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

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

------------------[cut]-----------------------------------

format ELF 
section '.text' executable 
public _start
_start: 
              push msg_len   ; size of message             
              push msg       ; offset of message 
              push 1         ; stdout
              mov  eax,4     ; 4 =  sys_write
              push eax       
              int  0x80      
              add  esp,4*3   ; очищаем за собой стэк

              xor  eax,eax
              push eax       ; код выхода
              inc  eax       ; 1 = sys_exit
              int  0x80               

section '.data' writeable 

              msg db "Hello world",0
              msg_len = $-msg

------------------[end cut]-------------------------------
  
vadim-lor
() автор топика
Ответ на: комментарий от vadim-lor

пардон. не то. это FreeBSD.

Linux

В линуксе используется fastcall конвенция. Номер функции, все так же, помещается в eax, а вот параметры, вместо стека, помещаются в регистры. Пример:

mov edx,msg_len mov ecx,msg mov ebx,1 mov eax,4 int 0x80

Порядок размещения параметров такой: № параметра Регистры 1 ebx 2 ecx 3 edx 4 esi 5 edi 6 ebp

Как видите максимальное количество параметров - 6. Если их больше, приходиться помещать все параметры в структуру и передавать ее адрес в ebx.

vadim-lor
() автор топика
Ответ на: комментарий от namezys

вообще пользы от асма щас 0

польза есть, но ее никто не ценит. и это плохо. потому есть разные питоны, руби, перлы и т.д.

и никто не говорит про полностью

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

зачем? в компиляторе есть куча встреоных функций для вызова специфичных процессорных вещей (типа веторизации).

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

namezys ★★★★
()
Ответ на: комментарий от vadim-lor

>и нельзя писаться кроссплатформенным, можно компилироваться под разные архитектуры

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

dn2010 ★★★★★
()
Ответ на: комментарий от vadim-lor

>польза есть, но ее никто не ценит. и это плохо.
пользы меньше, чем вреда.
ну выграешь ты 1 наносекунду. что дальше?

и нельзя писаться кроссплатформенным

вот ты иногда дело говоришь, а иногда такую вот ахинею!

ассемблер используется только там, где без него не получается обойтись

т.е. в низкоуровневом программировании. то, что мне и нужно

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

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

>ты думаешь там в регистры все пихается? очень в этом сомневаюсь: обычно проще все упаковать в одну структуру и отправить ее в ядро.

Если я правильно ошибась, системный вызов в Линукс x86 так и происходит: параметры функции распределяются по регистрам и вызывается int 80h.

proud_anon ★★★★★
()
Ответ на: комментарий от vadim-lor

>потому есть разные питоны, руби, перлы и т.д.

Да, действительно, давайте перепишем всё на асме.

Ставлю задачу. Есть, допустим, сайт, нужно дохига всего, интернет-магазин, интеграция с paypal, встроенный блог для разных юзеров, разные шаблоны + модный js. С тебя реализация за 1-2 месяца на чистом асме, без каких-либо дополнительных либ. И чтобы модуль дополнительный можно было добавить за день-два.

Да, забыл, надо две версии - одну под x86_64 на сервере, второую на x86 для десктопа разработчиков/верстальщиков.

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

>Да, действительно, давайте перепишем всё на асме.

Обо всем никто ничего и не говорит.

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

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

>Обо всем никто ничего и не говорит.

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

Что плохого в том, что человек что-то на асме хочет напистаь? Его право.

Абсолютно согласен.

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

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

anonymous
()

Если вам надо вызвать сисколлы, к асму даже близко не подходите, и даже не заикайтесь о «не ценят». На асме пишут ТОЛЬКО числодробилово, и только при наличии реализации на высокоуровневом языке.

slovazap ★★★★★
()

ничего не понял ;)

какой справочник? список все syscall'ов ?

и как это связано с asm?

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

А знает ли все заумные опкоды процессора (вроде SSE3) человек лучше чем компилятор (вроде gcc)?

Я думаю, что нет.

На ассемблере пишут stage 1 загрузчиков для mbr. Потому что счёт идёт на байты.

На ассемблере пишут на микроконтроллеры. Там тоже счёт идёт на байты (и на отдельные такты, иногда).

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

> На ассемблере пишут stage 1 загрузчиков для mbr. Потому что счёт идёт на байты.

Уже неактуально, особенно с постепенным приходом EFI.

На ассемблере пишут на микроконтроллеры. Там тоже счёт идёт на байты (и на отдельные такты, иногда).


Для этого есть Форт, в результате очень часто получается короче, чем на голом асме.

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

> Для этого есть Форт, в результате очень часто получается короче, чем на голом асме.

Это как так? О_0

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

Ruga-Suneto
()
Ответ на: комментарий от mix_mix

> Для этого есть Форт, в результате очень часто получается короче, чем на голом асме.

Зачастую нужно точное соответствие задержек, жёсткий рилтайм. А любой ЯВУ знатно плавает в зависимости от условий компиляции.

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