Возможно вы искали: 'Hovorun'

May 15 2025 19:35:39
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96111483
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18357
• Обзор The Walking ... 18801
• Обзор DMC: Devil M... 19879
• Обзор на игру Valk... 15877
• Обзор на игру Stars! 17764
• Обзор на Far Cry 3 17948
• Обзор на Resident ... 16024
• Обзор на Chivalry:... 17508
• Обзор на игру Kerb... 17981
• Обзор игры 007: Fr... 16619
Превью о играх
• Превью к игре Comp... 17960
• Превью о игре Mage... 14464
• Превью Incredible ... 14721
• Превью Firefall 13479
• Превью Dead Space 3 16334
• Превью о игре SimC... 14730
• Превью к игре Fuse 15442
• Превью Red Orche... 15542
• Превью Gothic 3 16343
• Превью Black & W... 17354
Главная » Статьи » Разное » Ассемблер в Unix (assembler linux freebsd)

Ассемблер в Unix (assembler linux freebsd)

Ключевые слова: assembler, linux, freebsd, (найти похожие документы)

From: marlyn <adain@mail.ru>
Newsgroups: http://www.wasm.ru
Date: Mon, 9 Dec 2003 14:31:37 +0000 (UTC)
Subject: Ассемблер в Unix

Оригинал: http://www.wasm.ru/print.php?article=asminunix

Ассемблер в Unix

#Введение

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

Настоящий ассемблерщик - зверь крайне редкий, практически нигде и не
встретишь его, разве что в заповеднике - http://wasm.ru. Unix-ассемблерщик
еще более редкий подвид, практически вымерший, если не считать,
западный, http://linuxassembly.org.

Для исправления такой плачевной ситуации, и была написана эта статья,
а точнее цикл статей, которые по задумке автора, должны привлечь в
ряды адептов-юникс-дзена множество новых членов.

В первой части (которую вы сейчас читаете) я имею честь познакомить
вас с прекрасным миром unix-программирования, что выльется в написание
простейшего helloworld. В следующей части - мы разберем несколько,
более сложных примеров. И под конец, наверное, будет программирование
под x-windows.


#Инструменты

Для нормально функционирования нам понадобятся следующие вещи:

1. Собственно какая-либо unix-совместимая ось. (например linux, или
лучше FreeBSD ),

2. Компилятор fasm. ( http://www.flatassembler.net )

3. Линкер ld ( есть почти в любом дистрибутиве unix ),

4. Особый склад ума, причем последнее - самое главное. Если у вас
этого нет, то ни один, даже самый последний RedHat на пару со
свежим fasm'ом вам не поможет.

И еще, о компиляторах - в unix обычно используются AS с AT&T
синтаксисом, который для многих людей, выросших на tasm'е и masm'е,
кажется полной абракадаброй. Поэтому, для начала, мы будем
использовать привычные компиляторы с Intel'овским синтаксисом (fasm
или nasm). Хотя позже, если найдутся желающие, можно будет рассмотреть
и AT&T asm.


#Общие сведения

Unix, который мы будем использовать - 32 битная система, работающая в
защищенном режиме, и использующая плоскую модель памяти.

Как и большинство операционных систем, Unix предоставляет программе
набор различных функций (по другому - Api). Но, в отличие от,
например, WinAPI, где вызовы производятся с помощью call'ов, в unix -
больше свободы: можно вызывать функция ядра напрямую, а можно
использовать многочисленные библиотеки. Рассмотрим для начала первый
способ.

Системный вызов производится с помощью прерывания 0x80 (чаще всего). К
сожалению, (а может и к счастью) существует несколько конвенций
вызова, что приводит к несовместимости кода между многими unix-like
осями. Я рассмотрю только две, самые популярные платформы: Linux и
*BSD.

FreeBSD (а также OpenBSD и NetBSD)

Эта система использует традиционную unix конвенцию вызова: номер
функции помещается в eax, параметры в стек, вызов производится с
помощью функции содержащей int 0x80, а результат возвращается в eax.
Наверное, понятнее будет, если рассмотреть это на примере:

sys_call:
int 0x80
ret
start:
push msg_len ; размер строки
push msg ; адрес строки
push 1 ; stdout
mov eax,4 ; номер системной функции - sys_write
call sys_call
add esp,4*3 ; очищаем за собой стек

Впрочем, от функции sys_call можно отказаться, достаточно просто
помещать в стек лишний dword:

start:
push msg_len ; размер строки
push msg ; адрес строки
push 1 ; stdout
mov eax,4 ; номер системной функции - sys_write
push eax ; все что угодно
int 0x80
add esp,4*3 ; очищаем за собой стек



Также FreeBSD поддерживает конвенцию вызова, применяемую в linux. Для
это необходимо включить linux emulation. Еще эта эмуляция потребуется
для запуска fasm. А еще нужна утилита brandelf (наверняка она у вас
есть). Дело в том, что пока не существует версии fasm'а конкретно для
BSD систем. Но это легко исправить, вот так:

Brandelf -t Linux fasm

Если это не сработает (а такое возможно из-за не совместимости
форматов), придется перекомпилировать fasm, заменив формат файла
"format PE executable" на простой "format ELF", а потом слинковать ld.


Linux
В линуксе используется fastcall конвенция. Номер функции, все так же,
помещается в eax, а вот параметры, вместо стека, помещаются в
регистры. Пример:

mov edx,msg_len
mov ecx,msg
mov ebx,1
mov eax,4
int 0x80

Порядок размещения параметров такой:

No. параметра Регистры
1
ebx
2 ecx
3 edx
4
esi
5
edi
6 ebp

Как видите максимальное количество параметров - 6. Если их больше,
приходиться помещать все параметры в структуру и передавать ее адрес в
ebx.



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

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

Ничего похожего на 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, или на форум http://wasm.ru/forum/

До встречи.

Примеры к статье:
http://www.opennet.ru/soft/asminunix.zip
(http://www.wasm.ru/pub/28/files/asminunix.zip)

[C] marlyn

© 2002 wasm.ru - all rights reserved and reversed
1160 Прочтений •  [Ассемблер в Unix (assembler linux freebsd)] [08.05.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Ассемблер в Unix (assembler linux f... Ukraine Vova 08.05.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка