Rambler's
Top100

Использование системного вызова 'read' в Linux

Автор: lonesome TSH/Digital Daemons
Дата: .02.2003
Раздел: Низкоуровневое программирование в Linux

Системный вызов Linux "read" (#3) предназначен для чтения из файла с текущей позиции. Также он может быть использован для чтения данных введенных с клавиатуры (используется файловый дескриптор 02 - stdin).

Ниже приведена программа, которая выведет введенные с клавиатуры символы на экран.

global _start

_start:

mov eax, 3	;Вызов #3
mov ebx, 2	;Дескриптор stdin
mov ecx, buffer	;Адрес буфера для хранения введенных данных
mov edx, 10	;Максимальная длина ввода
int 0x80	;Прерывание - системный вызов

mov eax, 4	;Вызов #4 (write)
mov ebx, 1	;Дескриптор stdout

;Системный вызов не изменил содержимое регистров ECX и EDX
; поэтому следующие две строчки не нужны
;mov ecx, buffer;Адрес строки для вывода
;mov edx, 10	;Длина выводимых данных

int 0x80	;Системный вызов

xor eax, eax	;Обнуление регистра EAX
inc eax		;Инкремент - увеличение на единицу
int 0x80	;Системный вызов

section .data	;Начало сегмента данных
buffer: resb 10	

Директива ассемблера resb 10 предназначена для резервирования указанного количества байт. Содержимое этих байт не определено, но поскольку они находятся в сегменте данных, то их содержимое будет равно нулю.

Команда xor операнд1, операнд2 на самом деле выполняет логическую операцию "исключающее или" над каждым битом операндов, т.е. какой-либо бит результата равен 1 только в том случае, если значения соотвествующих битов операндов различны. Эта операция чаще всего используется для обнуления регистров - очевидно, что если операнды равны, то все биты результата будут равны 0. Команды inc операнд увеличивает содержимое операнда на единицу. Для занесения единицы в регистр лучше использовать не mov reg, 1, а последовательность команд:
xor reg, reg
inc reg
поскольку команда mov в четырехбайтный регистр занимает пять байт, а указанная выше последовательность - только 3 байта. Аналогичным образом для занесения в регистр двойки лучше воспользоваться командой xor и дважды применить команду inc - это займет четыре байта



Rambler's Top100