Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #51, ФЕВРАЛЬ 2005 г.

Как *nix-системы потеряли портируемость

j1m (j1m@list.ru)

Спецвыпуск: Хакер, номер #051, стр. 051-092-1


Программируем на ассемблере под *nix

Думаю, что ты уже хорошо овладел языком C под платформу *nix, и теперь у тебя появилось желание глубже изучить тонкости *nix-кодинга. Если это так, то тебе повезло - в этой статье ты узнаешь много полезного о программировании на ассемблере под Linux и BSD.

Вполне возможно, что пока ты читал заголовок статьи, у тебя возник вопрос: "А кому это надо?" Действительно, зачем во времена гигагерцовых процессоров, жестких дисков емкостью в несколько сот гигабайт и таких технологий, как Java и .NET, уметь программировать на ассемблере? Еще актуальнее этот вопрос для *nix. Все знают, что родным языком *nix’ов является C. Разработчики нашей любимой ОС сделали все, чтобы облегчить жизнь C-кодерам и чтобы бросить ассемблерщиков на произвол судьбы. Такой подход оправдан, потому как трудно найти задачу, которую можно было бы решить на асме, но нельзя на C. А тем, кто все-таки натыкался на подобные задачи, предоставлялся удобный механизм вставки ассемблерных инструкций в C-исходник. Ну и зачем нужен асм в такой невероятно портируемой ОС, как *nix? Чтобы ответить на этот вопрос, достаточно прочитать название журнала ;). Первое, что приходит на ум - вирусы. Вирус должен быть маленьким, быстрым, а его код максимально оптимизированным. Также знание ассемблера под конкретную платформу поможет в исследовании программ и дизассемблировании. Даже в открытой ОС это может понадобиться (для анализа вирусов ;)). Ну и третий довод в пользу асма - оптимизация (хотя в настоящее время это не так актуально).

AT&T vs. INTEL

Перед тем как перейти к изучению архитектурных особенностей *nix’ов, ознакомлю с особенностями ассемблера, применяемого в *nix-системах. Дело в том, что стандартный ассемблер, входящий в состав пакета Binutils и носящий имя "as", использует AT&T синтаксис. Что это значит? Компьютерному миру известно два синтаксиса: Intel-синтаксис, используемый во всех DOS- и Windows- ассемблерах, и AT&T-синтаксис, разработанный одноименной компанией и используемый в *nix-ассемблере "as". Чтобы двигаться дальше, необходимо освоить этот самый синтаксис AT&T, который имеет множество отличий от интеловского.

Первое, что бросается в глаза, когда начинаешь изучать синтаксис AT&T, так это его стройность и продуманность. В нем нет такого количества неоднозначностей, присутствующих в синтаксисе Intel. Таких, например, как неопределенная размерность операндов.

Итак, начнем. Основные отличия от Intel-синтаксиса:

1. Порядок следования операндов противоположен привычному Intel-синтаксису, то есть сначала идет источник, а затем приемник.

2. Названия регистров должны начинаться с символа '%', а непосредственно операнды - с символа '$'.

movl $10, %eax # поместить в регистр eax число 10

3. К командам, принимающим операнды, должен добавляться суффикс, указывающий размерность этих операндов: b - байт, w - слово, l - двойное слово, q - учетверенное слово, s - 32-битное число с плавающей точкой, l - 64-битное число с плавающей точкой, t - 80-битное число с плавающей точкой.

Содержание  Вперед на стр. 051-092-2