Вы здесь: HomeLinux

Linux

Данный пост я хочу посвятить тому как написать простую программу на ассемблере для Linux. И так начнем с того что все системные вызовы в линуксе осуществляются с помощью прерывания 80h. Номер системного вызова содержится в регистре ЕАХ, если системный вызов(прерывание) принимает параметры то они находятся в регистрах EBX,ECX, EDX, ESI и EDI. Результат прерывания будет находиться в регистре ЕАХ и если результат будет от fffff000h до ffffffffh то это говорит что прерывание совершилось с ошибкой.  К примеру системная функция которая отвечает за ввод и вывод в консоли находиться под номером 4, а номер под функции будет находиться в регистре EBX. Теперь рассмотрим пример кода для FASM ассемблера:

format ELF executable 3
entry start
 
segment readable executable
 
start:
	mov	eax,4
	mov	ebx,1
	mov	ecx,msg
	mov	edx,msg_size
	int	0x80
 
	mov	eax,1
	xor	ebx,ebx
	int	0x80
 
segment readable writeable
 
msg db 'Hello world!',0xA
msg_size = $-m

ассемблер linux

Теперь все по порядку:
format ELF executable 3 - строка говорит нам что будет собран  исполняем файл  UNIX-подобных системах(linux к ним относиться).

start: - метка входа, то есть начало нашей ассемблер программы. Далее идет подготовка к выводу строки:

mov eax,4        ;указываем номер функции
mov ebx,1        ;затем говорим про номер подфункции, в данной ситуации это вывод строки 
mov ecx,msg     ;указываем адрес строки которую будем выводим
mov edx,msg_size ;вносим в регистр количество символов выводимой строки
int 0x80         ;и делаем прерывание
 

Затем код ниже отвечает за  выход из программы предварительно обнулив bx, для того чтоб сообщить системе что все было успешно. 

mov eax,1
xor ebx,ebx
int 0x80

И как вы видите в самом низу нашей программы были объявлены две переменные строка и ее количество символов.

msg db 'Hello world!',0xA
msg_size = $-m

Теперь давайте расмотрим как вводить символы для этого предназначен системный вызов под номером 3. Пример:

format ELF executable 3
entry start
start:
mov eax,3
mov ebx,1
mov ecx,msg
mov edx,19
int 0x80
;eax - содержит количество введеных символов... 
mov edx,eax  ;указываем кол символов которое нужно вывести
mov eax,4
mov ebx,1
mov ecx,msg
int 0x80
mov eax,1
xor ebx,ebx
int 0x80
msg db 20 dup (0) 
msg_size = $-msg

По всем вопросом пишите в коментариях.