2014-10-17 3 views
-1

Я новичок в Linux, для программирования сборки (GAS) и для английского. Поэтому, извините, если я напишу что-то неправильно. Надеюсь, Google Translate поможет мне написать все, что не так уж плохо.Что делает Linux при создании системного вызова?

Я хочу знать, как написать набор чисел, хранящихся в разделе .data, в текстовый файл без вызова функций из любых библиотек (например, printf()) и сделать это только с помощью возможностей ассемблера. Я не хочу готового решения. Я хочу знать, что делает ядро ​​Linux после моего вызова записи. Как это работает? Как это устроено?

Я пытаюсь распечатать список номеров в STDOUT, но я получаю нечетный знак в моем терминале. Я думал, это происходит потому, что я не понимаю, как правильно работать с системным вызовом.

Это то, что я получил на текущий

.section .data  
list:        .long 12, 31, 42 

.section .text  
.globl _start 
_start: 
movl $4, %eax 
movl $1, %ebx 
movl $list, %ecx 
movl $12, %edx 
int $0x80 
movl $1, %eax 
movl $0, %ebx 
int $0x80 

Этот код прекрасно работает для .ascii "Hello world\0", но не для списка чисел.

+0

Это невероятно широкий предмет и требует довольно много знаний о знании, чтобы понять, что я подозреваю, что у вас его нет.Возможно, вам захочется разбить его на куски размером с укусом, показать нам те усилия, которые вы сделали до сих пор, и где вы застряли. – tangrs

+0

Прочтите http://www.tldp.org/HOWTO/Assembly-HOWTO/. –

+0

Я прочитал «Программирование с нуля» Джонатана Бартлетта. Какой из них лучше? – user2422443

ответ

4

Прежде всего: (например. От libc.so)

Даже библиотечные функции внутренне использовать системные вызовы.

Системный вызов более или менее является специальным вариантом инструкции CALL. Эта команда вызовет некоторый код (как это делает CALL), но он переведет CPU в привилегированный режим (в этом режиме ЦП имеет доступ к адресам, к которым он не сможет получить доступ в пользовательском режиме) и адрес, в котором будет вызвана функция (определяется специальным регистром, доступ к которому возможен только в привилегированном режиме).

Функция, которая называется оценкой регистра EAX (при условии 32-разрядного Linux для x86) и выполняет желаемое действие (если EAX равно 4, тогда выполняется «запись»).

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

Для записи символов на экран, например, данные записываются в графическую память, которая расположена по адресу unxapped 0xB8000, который соответствует отображенному адресу 0xC00B8000 в старых ядрах.

Это означает, что инструкция «mov», записывающая некоторые данные на такой адрес, приведет к отображению символа на экране, когда экран находится в текстовом режиме.

Однако этот адрес (0xC00B8000) доступен только в том случае, если ЦП находится в привилегированном режиме. В противном случае исключается исключение (это также какой-то «CALL», который вызван аппаратным обеспечением, а не программным обеспечением); процедура, которая вызывается в этом случае, выведет что-то вроде «Ошибка шины» и остановит программу.

--- Edit ---

О отредактированном вопрос:

"Записать" системный вызов будет писать ASCII-символов на экран или в файл.

Если вы хотите написать номера, вам нужно будет преобразовать число в последовательность символов ASCII.

+0

Вау! Это сложно. Спасибо! Я отредактировал свой вопрос и сделал его более конкретным. Не могли бы вы взглянуть на него и показать мне направление для размышлений? Что я должен понять, чтобы сделать это правильно? – user2422443

+0

Получил! Это то что мне нужно! Большое спасибо! – user2422443

Смежные вопросы