Низкоуровневое программирование для Дzenствующих
Вид материала | Документы |
- Низкоуровневое программирование, 108.99kb.
- Курс является базовым как для изучения других математических дисциплин, так и для более, 36.89kb.
- 1 Обобщенное программирование. Обобщенное программирование это еще одна парадигма программирования,, 55.18kb.
- Введение в линейное программирование линейное программирование (ЛП), 139.72kb.
- Учебно-методический комплекс для студентов заочного обучения специальности Прикладная, 63.23kb.
- Аттестационное тестирование в сфере профессионального образования, 72.49kb.
- Лекции по дисциплине «Социальное моделирование и программирование», 44.69kb.
- Программа дисциплины Линейное программирование Семестр, 17.93kb.
- Программа дисциплины "Программирование" для направления, 488.76kb.
- Рабочая программа по дисциплине Программирование на языке высокого уровня для специальности, 182.97kb.
#Описание системных функций
После того как вы разобрались с вызовом функций, будет логичным вопрос: "А где взять описание этих самых функций?".
Ничего похожего на 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 «вместе навсегда».