Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
int 80h - это устаревший способ вызова функций ядра в x86-64. В x86-64 это можно сделать без прерываний, с помощью команды syscall, что на порядок быстрее и экономнее, но не совместимо с x86.
Ну вот мне что интересно - если на время забыть про sysenter/syscall, то int 80h, вроде как, работает и там и там. А коды сисколлов, емнип, разные (ну и аргументы само собой 64-битные у x86_64 и в других регистрах). Значит ядро отличает, когда запрос приходит из compatibility, а когда из long? Или я гоню?
Ну апи в либе, а либу ему как раз таки хочется отпилить.
На самом деле, в винде точно так же. Все эти kernel32.dll и.т.п. просто более высокоуровневые обёрточки над сисколлами, которые можно дёргать через int/sysenter/syscall.
Апи чего? В ядро передать управление можно только прерыванием, sysenter'ом, syscall'ом и call gate'ом (но я не видел, чтобы оси call gate юзали). Всё остальное, что есть в dll'ках/so'шках - такие же бесправные юзермодные функции, как и у твоей проги. Никакой магии в них нет, ты всегда можешь написать их сам.
А ОП как раз таки захотел написать прогу, которая не будет юзать все эти сахарные so'шки, а будет общаться только с ядром операционки.
Я думал, он не хочет подключать stdlibc. Мне так показалось, потому что он сам так написал.
Отсутствие одного заголовка не мешает самому подключиться к нужным сошкам.
Ну, кстати, ещё вариант есть. Найти linux-gate.so в памяти, и позвать у него функцию, делающую сисколл одним из вышеперечисленных методов. Хотя... она тоже под асм заточена.
Да там ёбаный пиздец. Куча мусора типа двойных процентов и долларов. Да ещё и всё вверх ногами. Неприятный ассемблер, если честно.
Но интеграция того стоит - гцц старается, чтобы значения в нужных регистрах вовремя оказались и т.п. И в дизасме вставка не выглядит инородным телом, как в той же вижуалке.
Я не понимаю, для чего там макросы, заменяющиеся на регистры (типа "a" вместо ax/eax/rax). Это было бы объяснимо, если бы оно обеспечивало кроссплатформенность. Но ведь в любом случае при переносе на другую платформу придётся полностью переписывать все ассемблерные инструкции. Разве что иногда удастся сэкономить на замене eax→rax при портировании с x86 на x86_64.
не путайте Inline assambler с GCC AS это 2 разные вещи с одинаковым синтаксисом и GCC позволяет интел синтаксис http://pastebin.com/CZGq2pLw Парсер BBCode лох
"игнорировать \n" читай как "игнорировать \0"
Видимо для того, чтобы не париться с разрядностью. Буква превращается в нужный регистр автоматически в зависимости от типа переменной, которую туда записывают.
всю логику делать на кт315
А не люблю AT&Tшный синтаксис
Но всё же "Царь переносимого кода" звучало бы посильнее. С учётом местной специфики
Ну там sysenter был.
На самом деле, в винде точно так же. Все эти kernel32.dll и.т.п. просто более высокоуровневые обёрточки над сисколлами, которые можно дёргать через int/sysenter/syscall.
А ОП как раз таки захотел написать прогу, которая не будет юзать все эти сахарные so'шки, а будет общаться только с ядром операционки.
Отсутствие одного заголовка не мешает самому подключиться к нужным сошкам.
> одного заголовка
Ну и саму либу он тоже не линкует к проге.
http://ideone.com/UNXSt1
P.S. ideone не даёт опции задавать, поэтому main().
Но интеграция того стоит - гцц старается, чтобы значения в нужных регистрах вовремя оказались и т.п. И в дизасме вставка не выглядит инородным телом, как в той же вижуалке.
Кстати, там же не только конкретные регистры можно писать, но и полезные штуки типа "любой регистр", "память", "память или регистр" и т.п.
http://pastebin.com/CZGq2pLw
Парсер BBCode лох
"игнорировать \n" читай как "игнорировать \0"
PS. код писал давно.
PS. Точка входа в Linux не main, а _start.
Но я же написал, почему там main... ideone команду компилятора не даёт поправить.
Вот тут можно задать свои ключи.