Раздел «Язык Ассемблера».NasmSyscallRead:

Использование системного вызова 'read' в 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, а последовательность команд:

xor reg, reg
inc reg

поскольку команда mov в четырехбайтный регистр занимает пять байт, а указанная выше последовательность - только 3 байта. Аналогичным образом для занесения в регистр двойки лучше воспользоваться командой xor и дважды применить команду inc - это займет четыре байта