2014-01-08 2 views
1

Я начал изучать сборку для арки ARM. Я читал в некоторых pdf-файлах и небольших учебниках в сети. Я понял код там. Но когда я написал простую глобальную программу hello в GCC, он дал файл сборки, содержимое которого сильно отличалось от того, что я узнал в pdf и в Интернете. (Я имею в виду главным образом директивы сборки).Код сборки, созданный различными компиляторами?

SO, это означает, что код сборки, сгенерированный разными компиляторами, отличается (все используют разные способы написания ассемблерных директив и некоторых других вещей). Как и все, что я читал в Интернете, я думаю, что они были основаны на компиляторе Kiel.

Если то, что я написал выше, истинно, тогда, согласно компилятору, я изучу язык ассемблера для ARM.

+1

В общем, вы должны изучить вариант asm, используемый используемым ассемблером (или выбрать ассемблер на основе вашего варианта). Некоторые могут поддерживать несколько синтаксисов. Кроме того, различные варианты ARM используют разные общие синтаксические базы, например, оригинальное руководство программиста Acorn Risc Machine имеет совершенно иной синтаксис для современной сборки armv5tel. – mirabilos

+1

даже в том же компиляторе выходной двоичный файл также зависит от переключателей, которые вы указали во время компиляции. –

+1

'gcc' хорошо подходит для изучения ассемблера ARM/Thumb-2 ** через встроенный ассемблер ** (многие другие поддержка встроенного ассемблера). Кроме того, он свободен в использовании. Вам не нужно беспокоиться о разделах и т. Д. И писать небольшие фрагменты ассемблера. Часто лучше использовать встроенный ассемблер. Распределение регистров - очень скучная и утомительная работа, а также функция пролог/эпилог. Вы можете постепенно воспринимать инструкции типа ALU и т. Д., Прежде чем вам придется иметь дело с концепциями памяти/раздела/функций. Часто вы должны знать компоновщик с чистым ассемблером. –

ответ

2

Вы должны изучить сборку в соответствии с набором инструкций и архитектурой машины, которую у вас есть (и директивы в соответствии с используемым ассемблером). Две из основных причин обучения сборке - понять набор команд и делать то, что просто невозможно на языке более высокого уровня, - глядя на подмножество функциональности, которая сопоставляется с этим более высоким языком, не все это полезно в любом отношении, тем более, если оптимизация компилятора превратила его в неузнаваемость. Я бы сказал, что это особенно верно в ARM, где набор инструкций может делать всевозможные дурацкие вещи - это совершенно другая парадигма с высших языков и лучше всего решать на своих собственных условиях.

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

Таким образом, скомпилированный код может быть полезен для самых оснований, таких как «то, что этот цикл выглядит в сборе» - в этом случае выбор компилятора не должен иметь значения, поскольку вы хотите сохранить вещи как простой как возможно. Это означает, что отключить все оптимизация, придерживаться стандартного C (лично я бы даже пошел на ANSI C по C99) и сохранить код интереса к небольшим отдельным функциям, поэтому легче разобраться в разборке. Однако из-за оснований это меньше «язык обучения ассемблера» и более «изучение C в контексте языка ассемблера».

+1

Во второй раз, используя ассемблер, снабженный компилятором C, который вы используете, вы хотите связать, чтобы собрать любой код, который вы пишете, с остальной частью программы на C или C++, и, скорее всего, выгрузите нерабочие критические части компилятор. – marko

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