2014-10-30 3 views
6

Я решил изучить язык ассемблера, потому что я узнал, что он имеет много преимуществ, мы можем напрямую взаимодействовать с оборудованием, мы можем узнать, как компьютеры лучше, и многое другое. Когда я начал сначала изучать его, я узнал, что это немного странно, а не как другие языки программирования, поэтому я подумал, что, может быть, мне будет трудно учиться. Итак, я просто спрашиваю, каковы основные предпосылки для изучения ассемблерного языка. Для получения информации я уже изучил языки программирования, такие как C, C++, C#, PHP.Предпосылки для обучения Язык ассемблера

+1

IMO, вы должны быть знакомы с шестнадцатеричным и двоичным обозначением чисел, побитовыми логическими операциями ('и', 'или', 'xor', ...) и моделью памяти вашей целевой архитектуры/ОС. Некоторые книги/учебники по программированию сборок могут объяснить эти вещи, другие могут предположить, что вы уже знаете их. – Michael

ответ

7

Вы должны сказать нам, какую сборку компьютера вы хотите изучить. ARM, , Sparc и т. Д. Все разные ISA.

Если вы просто хотите познакомиться с миром ассемблерного программирования в целом, то Randal Hyde's Art of Assembly является хорошим (хотя то, что вы пишете, не является точно сборкой, а скорее комбинацией между языками высокого и низкого уровня, оно представит вы к концепции красиво).

Если вы установили свои достопримечательности на x86, я могу порекомендовать эту книгу: Professional Assembly Language. Помимо этой книги, sandpile.org - отличный ресурс.

Для x86 выбор окружающей среды также имеет значение. Here - отличный учебник по программированию окон в Университете штата Иллинойс. Урбана Шампейн. Студия ACM - SIGWINDOWS. Для Unix отличный учебник, который я встречал, - this one. Отличным, более общим ресурсом является Reverse Engineering for Beginners Деннис Юричев. Эта книга ориентирована как на окна, так и на среды Unix, и хотя это касается обратной инженерии, она может помочь вам много узнать о махинациях программ, запущенных на вашем компьютере.

Для ARM, this article служит отличным представлением. This article is also another great introduction to the matter

+0

+1, ссылка sandpile.org потрясающая! –

0

Сборка не похожа ни на один из тех языков более высокого уровня, которые вы уже узнали.

Хорошее место для начала было бы x86 Регистры, вот сайт я нашел их объяснения:

http://www.eecg.toronto.edu/~amza/www.mindsec.com/files/x86regs.html

Успехов!

EDIT:

Кроме того, это всегда хорошо, чтобы начать и придерживаться определенного языка ассемблера, например, я начал с NASM, который имеет довольно приличный размерный сообщества и имеет некоторые интересные функции, как управление символов и пространств имен.

+0

- это все, что нам нужно? что все, что нам нужно, чтобы изучить этот сложный язык? –

+0

Нет, я сказал, что это будет хорошее место для начала. – dreamgt

1

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

+0

Я действительно спрашиваю о том, какие учебные предпосылки для языка ассемблера, а не о том, какой материал потребуется для изучения языка ассемблера. –

+2

Я не думаю, что есть какие-то реальные предпосылки. это не так, как с физикой, что вы должны изучать алгебру, прежде чем сможете научиться физике Ньютона. – timwaagh

3

Я начал программирование в сборке около двух месяцев назад, и до сих пор все прошло очень хорошо. Позвольте мне дать небольшое резюме того, что я узнал до сих пор.

Синтаксис

Есть два основных синтаксиса для сборки x86: Intel и AT & T. Для каждого есть плюсы и минусы.Синтаксис Intel, по-видимому, используется только для процессоров на базе x86, тогда как синтаксис AT & T используется для нескольких разных архитектур (например, ARM). Если вы посмотрите на исходный код для OpenBLAS, вы увидите, что они используют синтаксис AT & T для нескольких разных архитектур. Однако многие считают, что синтаксис Intel более читабельен. До сих пор я программировал с использованием синтаксиса Intel, но я знаю, как читать синтаксис AT & T по большей части.

Монтажники

Вы можете использовать встроенный ассемблер с GCC, но не с MSVC 64-бит. До сих пор я не беспокоился о встроенной сборке. Существует несколько ассемблеров, которые вы можете выбрать: MASM, NASM, YASM, FASM и GAS. MASM использует только синтаксис Intel и используется только для Windows, насколько я понимаю (я не думаю, что это могут быть объектные файлы ELF для Linux). NASM также использует только синтаксис Intel, но может создавать несколько разных объектных файлов, например. для Windows и Linux. YASM, насколько я могу судить, является NASM по большей части, но также поддерживает AT & T синтаксис. FASM использует синтаксис Intel и может создавать несколько разных объектных файлов, но он несколько отличается от NASM и YASM. Я еще не использовал FASM, но он выглядит заманчивым. GAS использует синтаксис AT & T (хотя можно использовать синтаксис Intel), и на самом деле это то, что используется при компиляции с GCC. GCC производит сборку, которая отправляется в ГАЗ.

Важно понимать, что каждый ассемблер имеет только диалект, поэтому вы не можете ожидать, что код, написанный в MASM, обязательно собирается из коробки в NASM. NASM и YASM по большей части совместимы, хотя, насколько я понимаю.

Какой ассемблер вы должны выбрать? До сих пор я использовал NASM.

Calling конвенции и связь с C

Лучший источник для изучения сборки для меня до сих пор GCC. Напишите код на C, а затем посмотрите на сборку. Например, если у вас есть простая функция foo вы можете сделать

gcc -O3 -S foo.c    //AT&T syntax 
gcc -O3 -S -masm=intel foo.c //Intel syntax 

затем посмотреть на файл foo.s или вы можете использовать objdump

gcc -O3 -c foo.c 
objdump -d foo.o    //AT&T syntax 
objdump -d -Mintel foo.o  //Intel syntax 

Вы должны знать function calling conventions вашей ОС. Вызывающие соглашения отличаются для 32-битного кода и 64-битного кода. Для Windows и Linux они одинаковы для 32-битного кода, но разные для 64-битного кода. До сих пор я только написал код сборки с NASM для Linux 64-бит.

Многие вопросы сборки на SO, похоже, касаются написания целых функций в сборке, включая ввод и вывод данных пользователя. Я не думаю, что это необходимо. Пусть C заботится о вводе и выводе. Вы можете увидеть пример этого this question. Я дал код NASM и код C, а также объяснил, как собрать, скомпилировать и связать их. Это была одна из первых вещей, которые я написал в сборке x86. В этом вопросе я имел функцию

float triad(float *x, float *y, float *z, const int n); 

в Linux x86-64 (или скорее System V AMD64 ABI) соглашения о вызовах передать первый параметр в rdi регистре, второй в rsi и третий это rdx. Итак, в этом случае rdi=x, rsi=y, rdx=n.

Как только вы получите соглашения о вызовах и можете связывать свои объектные файлы с сборки с помощью C, вы найдете работу с сборкой намного проще.

И, наконец, вторым лучшим источником обучения для меня было Agner Fog's Optimizing Assembly manual. В первой части руководства для начинающих есть много хороших советов. И как только вы получите некоторый опыт, в более поздней части руководства есть много хорошей информации.

1

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

Я изучил язык ассемблера (основы, просто не нужно больше) в качестве моего первого языка программирования (без какого-либо преподавателя) с Assembly Language Step-by-Step: Programming with Linux 3rd Edition. Он преподает основы, но после прочтения этой книги вы можете без проблем прочитать любые другие передовые сборники.

Смежные вопросы