Использование системного вызова 'read' в Linux
- Автор: Гиви Чопикашвили
- Дата: 01.02.2003
- Раздел: Низкоуровневое программирование в Linux
Системный вызов Linux "read" (#3) предназначен для чтения из файла с текущей позиции. Также он может быть использован для чтения данных введенных с клавиатуры
(используется файловый дескриптор 2 - 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
, а последовательность команд:
поскольку команда mov в четырехбайтный регистр занимает пять байт, а указанная выше последовательность - только 3 байта. Аналогичным образом для занесения в регистр двойки лучше воспользоваться командой
xor
и дважды применить команду
inc
- это займет четыре байта