Низкоуровневое программирование для Дzenствующих

Вид материалаДокументы
Подобный материал:
1   ...   17   18   19   20   21   22   23   24   ...   42

#Описание системных функций


После того как вы разобрались с вызовом функций, будет логичным вопрос: "А где взять описание этих самых функций?".

Ничего похожего на msdn, в unix среде к сожалению не существует, но не нужно забывать: unix - система с открытым исходном кодом и все нужное, можно найти там.

Для linux:
arch/i386/kernel/entry.S
include/asm-i386/unistd.h
include/linux/sys.h
Для FreeBSD:
i386/i386/exception.s
i386/i386/trap.c
sys/syscall.h

Для каждой функции можно посмотреть описание, используя man(2).

 

#Пример программы. Hello world


Пришло время написать, тот самый, жутко всем надоевший - HelloWorld.

Я приведу пример только FreeBSD версии, переписать это под linux - будет вашим домашним заданием. (для самых ленивых - см. примеры к статье)

------------------[cut]-----------------------------------


format ELF

section '.text' executable

public _start

_start:

push msg_len ; size of message

push msg ; offset of message

push 1 ; stdout

mov eax,4 ; 4 = sys_write

push eax

int 0x80

add esp,4*3 ; очищаем за собой стэк


xor eax,eax

push eax ; код выхода

inc eax ; 1 = sys_exit

int 0x80


section '.data' writeable


msg db "Hello world",0

msg_len = $-msg


------------------[end cut]-------------------------------

Сборка.
Сначала скомпилируем файл, вот так:

fasm hello.asm hello.o

А потом слинкуем:

ld -o hello hello.o

А теперь посмотрите на размер. 600 байт, впечатляет?! ( размер можно еще очень сильно уменьшить, но об этом, как-нибудь в другой раз)

 

#Использование библиотеки libc


Некрасивый и совсем не дзенский способ, но все же мы его рассмотрим - для полноты картины.

Итак, libc (c library) - это стандартная библиотека с для UNIX. Она содержит в себе кучу полезных функций, типа printf, и используется почти во всех обычных программах (кстати сказать, многие функции этой библиотеки - простые обертки над вызовами ядра).

В FASMе существуют удобные макросы, для вызова си функций..., но я не буду их использовать, отдав предпочтение чистому ассемблеру.

Пример:


------------------[cut]-----------------------------------

format ELF

section '.text' executable


extrn printf


public main

main:

push msg

call printf

add esp,4

ret


section '.data' writeable


msg db "Hello world!\n",0

------------------[end cut]-------------------------------

Компилируется это дело так:

fasm hellolib.asm hellolib.o

gcc -o hellolib hellolib.o

Заключение.

Ну вот вы и написали свою первую программу на ассемблере под UNIX.

Все на много проще чем кажется, неправда ли?

Eсли у вас возникнут какие-либо вопросы, пишите мне на adain@mail.ru, или на форум ссылка скрыта.

До встречи.

(c) 2003, marlyn adain@mail.ru


Broken Sword / [HI-TECH]

Ассеблер в *nix – удел извращенца..?


A lot of people ask me..
stupid fuckin questions.
A lot of people think that..
ассемблера в *nix не существует.
(С) типа Eminem

Да, асм в *nix таки существует. Просто многие в это почему-то отказываются верить. Данная статья скромно претендует развеять все мифы и загадки вокруг этого загадочного явления. Не ищите здесь подробного описания AT&T синтаксиса и системных вызовов – я просто попробую описать те трудности и невзгоды, которые обязательно придется преодолеть смельчаку, желающему полностью овладеть *nix-ом через асм (в смысле - научиться программировать на асме под *nix, прим. для CyberManiac-а :) ).

Миф I:

“Синтаксис асма под *nix в корне отличается от оного под DOS/WIN, он кривой и к нему невозможно привыкнуть”.

Действительно, синтаксис, предложенный компанией AT&T, немного (безусловно, в лучшую сторону) отличается от Intel’овского. Но это ничего не значит. На самом деле, если бы все еще с детства начали кодировать, используя AT&T синтаксис, то интеловский очень скоро загнулся бы и не дожил до наших дней. Просто AT&T в свое время не стремилась делать свои поделки достоянием народных масс, это прерогатива MS и Intel (а вообще у AT&T уже существовала своя развитая культура и традиции, когда MS и Intel только спускались с деревьев :) ).

А уж если кто-то переборол свои страхи и все же перешел к AT&T с Intel, того точно уже за уши не оттянешь назад. По этому поводу когда-то даже родился проект DJGPP (GNU Binutils) - асм с AT&T синтаксисом под DOS (ссылка скрыта). Однако в силу непонятных причин проект не прижился.

Если все эти доводы кому-то показались слишком хлипкими и невразумительными, то нет ничего проще - ссылка скрыта. Качайте себе NASM под *nix и будьте с Intel «вместе навсегда».