Форум программистов, компьютерный форум, киберфорум
Assembler: Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
 Аватар для XiloManX
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277

Взаимодействие с Linux

02.11.2016, 22:22. Показов 2996. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Модератор, закрепи тему, пожалуйста.

Сделал перевод малюсенькой статьи. А то раздел, по программированию на Ассемблере под Linux, как-то обделили.

X86 Assembly/Взаимодействие с Linux.


Автор перевода: XiloManX.
Дата перевода: 02.11.2016

Перевод статьи из электронной книги "x86 Assembly":
https://en.wikibooks.org/wiki/... with_Linux

От автора перевода:
Это, мой первый технический перевод. Поэтому, заранее прошу прощение, за возможные грамматические ошибки и возможную неточность перевода.

Системные вызовы.

Системные вызовы являются интерфейсом между пользовательскими программами и ядром Linux. Они используются, чтобы позволить ядру выполнять различные системные задачи, такие как: доступ к файлам, управление процессами и создание сетей. В языке программирования С, вы, как правило, вызываете функцию-обертку, которая выполняет все необходимые действия, или даже используете функции высокого уровня из стандартной библиотеки ввода-вывода.

В Linux, есть несколько способов сделать системный вызов. Данная страница, будет сосредоточена на создании системных вызовов, путем вызова программного прерывания, с помощью: int $0x80 или syscall. Это простой и интуитивно понятный способ, для того, чтобы делать системные вызовы только в ассемблерных программах.

Создание системного вызова.

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

Каждый системный вызов имеет фиксированный номер (примечание: между собой $0x80 и syscall отличаются номерами!). Вы указываете системный вызов, путем записи номера в регистр eax/rax.

Чтобы выполнить свою задачу, большинство системных вызовов принимают параметры. Перед выполнением вызова, эти параметры, передаются путем записи их в соответствующие регистры.
Каждый индекс параметра имеет специальный регистр. Для того, чтобы увидеть различия, между int $0x80 и syscall, см. таблицы в подразделах. Параметры передаются в порядке, в котором они определены в описании функции, соответствующей обертке функции C. В каждой документации по Linux API, для справки, вы можете найти функции системных вызовов и их описание (например: чтобы увидеть описание системного вызова open, напечатайте в терминале man 2 open).

После того, как все настроено правильно, вы вызываете прерывание используя int $0x80 или syscall, и ядро выполняет задачу. Возвращаемое значение системного вызова, об удаче или ошибке, записывается в регистр eax/rax.

Для выполнения действий, ядро Linux использует свой собственный стек, и никаким образом не затрагивает стек пользователя.

int $0x80

На обоих системах Linux, x86 и x86_64, вы можете сделать системный вызов, вызвав прерывание 0x80 с помощью команды int $0x80. Параметры передаются путем установки регистров общего назначения следующим образом:

№ сис. вызоваПарам 1Парам 2Парам 3Парам 4Парам 5Парам 6
eaxebxecxrdxesiediebp
Возвр.значение
eax

Номера системных вызовов описаны в исходном файле Linux: arch/x86/include/asm/unistd_32.h.
Во время системного вызова, все регистры сохраняются.

syscall

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

№ сис. вызоваПарам 1Парам 2Парам 3Парам 4Парам 5Парам 6
raxrdirsirdxr10r8r9
Возвр.значение
rax

Номера системных вызовов описаны в исходном файле Linux: arch/x86/include/asm/unistd_64.h.
Во время системного вызова, все регистры сохраняются, за исключением rcx и r11.

Примеры.

Для того, чтобы подвести итог и уяснить информацию, давайте посмотрим на очень простой пример: программа привет мир. Она будет писать текст "Hello World" на стандартный вывод, используя системный вызов write, а выход из программы, с помощью системного вызова _exit.

Описание системных вызовов:
C
1
2
ssize_t write(int fd, const void *buf, size_t count);
void _exit(int status);
Это программа на языке С, которая ниже реализована на ассемблере:
C
1
2
3
4
5
6
7
#include <unistd.h>
 
int main(int argc, char *argv[])
{
    write(1, "Hello World\n", 12); /* написать в ст.вывод "Hello World". */
    _exit(0);                      /* выход с кодом ошибки 0 (нет ошибки) */
}
Оба примера, начинаются так: строка, хранится в сегменте данных и _start, в качестве глобального символа.

Assembler
1
2
3
4
5
.data
msg: .ascii "Hello World\n"
 
.text
.global _start
int 0x80

Как определено в: arch/x86/include/asm/unistd_32.h, номера системных вызовов для write и _exit, будут такими:
C
1
2
#define __NR_exit 1
#define __NR_write 4
Параметры передаются в той же последовательности, что и в программе на языке C, но с использованием правильных регистров. После чего, системный вызов выполняется с использованием int $0x80.

Assembler
1
2
3
4
5
6
7
8
9
10
_start:
    movl $4, %eax   ; использовать сис. вызов write.
    movl $1, %ebx   ; печатать в стандарный вывод.
    movl $msg, %ecx ; использовать строку "Hello World".
    movl $12, %edx  ; печатать 12 символов.
    int $0x80       ; сделать системный вызов.
    
    movl $1, %eax   ; использовать сис. вызов _exit.
    movl $0, %ebx   ; код ошибки 0.
    int $0x80       ; сделать системный вызов.
syscall

Номера системных вызовов определённы в файле - arch/x86/include/asm/unistd_64.h , следующим образом:
C
1
2
#define __NR_write 1
#define __NR_exit 60
Параметры переданы так же, как в примере с int $0x80, только порядок регистров другой. A системный вызов, сделан при помощи инструкции syscall.

Assembler
1
2
3
4
5
6
7
8
9
10
_start:
    movq $1, %rax   ; использовать сис. вызов write.
    movq $1, %rdi   ; печатать в стандарный вывод.
    movq $msg, %rsi ; использовать строку "Hello World".
    movq $12, %rdx  ; печатать 12 символов.
    syscall         ; сделать системный вызов.
    
    movq $60, %rax  ; использовать сис. вызов _exit.
    movq $0, %rdi   ; код ошибки 0.
    syscall         ; сделать системный вызов.
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.11.2016, 22:22
Ответы с готовыми решениями:

Взаимодействие QTcpSocket c сервером на linux
Написал простой эхо сервер-клиент. Использую QTcpSocket на клиенте, пытаюсь отправить на сервер сообщение, а сервер выводит пустую строку....

Обеспечить взаимодействие между машинами Windows и Linux
Есть задача. Имеются две машины: (B) Windows и (С) Linux. Для машины (B) написано desktop-приложение, которое отправляется некие файлы на...

Linux и Windows на одном диске - странное взаимодействие двух систем
Установила две операционки на одном компе. Получилось так: 1---изначально удалила все разделы на винте (программа для работы с дисками,...

5
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.11.2016, 20:56
Цитата Сообщение от XiloManX Посмотреть сообщение
Модератор, закрепи тему, пожалуйста
Лучше положи к себе в блог. Хотя бы возможность редактировать будет.

А в общем смысле статья довольно бесполезна, т.к. подразумевает ну очень узкий круг читателей. Большинство начинающих эту статью не поймут, потому что в ней много букв, но ни одного внятного пояснения, а что дальше с этими буквами делать. Т.е. после прочтения статьи надо ковыряться в гугле, чтобы понять, что делать с полученными знаниями. А продвинутые в общем-то и так это знают
0
Заблокирован
03.11.2016, 21:01
Хоть бы про gas что-нибудь написали. А то какие-то сорцы непонятные, что с ними делать - тоже не понятно
0
 Аватар для XiloManX
644 / 148 / 31
Регистрация: 11.02.2013
Сообщений: 277
04.11.2016, 02:48  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Лучше положи к себе в блог. Хотя бы возможность редактировать будет.
Да кто, туда заглядывать-то будет? Никто. А тут, рядышком.
Цитата Сообщение от Evg Посмотреть сообщение
А в общем смысле статья довольно бесполезна, т.к. подразумевает ну очень узкий круг читателей.
Кому, как! Вот если бы, я её раньше увидел, то мне, она была бы очень полезной.
Цитата Сообщение от Evg Посмотреть сообщение
Большинство начинающих эту статью не поймут, потому что в ней много букв, но ни одного внятного пояснения, а что дальше с этими буквами делать.
Школота и студентота, нет. А для ассемблерщиков, осваевающих программирование на низком уровне в Linux - будет полезна.
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. после прочтения статьи надо ковыряться в гугле, чтобы понять, что делать с полученными знаниями.
Там, всё ясно написано, где искать описание и куда класть параметры. Ковыряться особо не требуется.
Цитата Сообщение от Evg Посмотреть сообщение
А продвинутые в общем-то и так это знают
А я, свой перевод, выкладывал не для продвинутых, а для любознательных линуксоидов-ассемблерщиков, вроде меня. К тому же, буржуйский язык не все знают, или знают, но плохо, а тут на родном языке.
Цитата Сообщение от nimazzzy Посмотреть сообщение
Хоть бы про gas что-нибудь написали.
Про gas, книг и статей, в сети хватает (в том числе и на русском языке). Дублекат ненужен. Лично я люблю FASM и им пользуюсь постоянно, и gas меня интересует в последнюю очереть. Хотя понять синтаксис gas, несложно - он простой. А перевести синтаксис gas, на FASM, несложно.
Цитата Сообщение от nimazzzy Посмотреть сообщение
А то какие-то сорцы непонятные, что с ними делать - тоже не понятно
Если знаешь gas и немного С, то все сорцы очень понятны. Там всё доступно описано.
0
Evg
04.11.2016, 15:04

Не по теме:

Цитата Сообщение от XiloManX Посмотреть сообщение
Там, всё ясно написано, где искать описание и куда класть параметры. Ковыряться особо не требуется
Классический ответ человека, который пишет статью сам для себя. Удачи в дальнейших переводах

0
04.11.2016, 15:16  [ТС]

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
Классический ответ человека, который пишет статью сам для себя.
Ещё раз повторю: я статью не писал, лишь сделал перевод для всех, а то, раздел пустой - обидно. Мне статья не очень нужна, я это всё и так давно знаю.
Цитата Сообщение от Evg Посмотреть сообщение
Удачи в дальнейших переводах
А вот, за это спасибо.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.11.2016, 15:16
Помогаю со студенческими работами здесь

[Mono] Подскажите ide c# под linux чтобы компилировался файл для linux
Подскажите ide c# под linux чтобы компилировался файл для linux не как в monodevelop

Ошибка Kernel driver not installed (rc=-1908) linux в VirtualBox (Linux Mint)
При попытке запустить ВМ в VB вылетает ошибка Kernel driver not installed (rc=-1908)Смотрел в интернете - пишут, что нужно отключить в BIOS...

Разметка в Linux жесткого диска для дуалбут MS-DOS и Linux
У меня, значит, на стационарном старичке стоит жесткий на 2 Тб. Win XP такие цифры не знает, а вот видит ли такой обьем linux? ...

Нужен компилятор под linux mint или linux ubuntu
Нужен компилятор под linux mint или linux ubuntu. Желательно голенький компилятор без редактора, и, было бы классно, без интерфейса (как...

Linux mint + win 8 + uefi + hibernate - пропал загрузчик linux
Здравствуйте, скажу сразу, линукс установил впервые, поэтому может вопрос будет нубский. На ноуте lenovo b590 - есть предустановленная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru