Разное

Ассемблер для чего нужен: Для чего нужен ассемблер? — Хабр Q&A

Содержание

Что такое Ассемблер?Зачем он вообще нужен?Что мы будем изучать?

Я думаю вам известо
что PC не понимает слов,предложений и т.п.Всё что понятно этой замечательной
машине — это наборы единиц и нолей(пример:0110 ).Зато люди двоичную систему не
сильно любят(за исключением некоторых странных личностей).Поэтому когда первым
програмистам надоело писать программы в двоичных кодах и вводить при помощи
перфорированых карт они быстро замутили hex(шестнадцатиричный) редактор(пример простой  дос программы выводящей сообщение: b409ba0901cd21cd2048656c6c6f20776f726c642124).
Написать программу стало легче,но мастера
древности решили что этого мало и изобрели Ассемблер.Теперь команды процессора
можно было записать на понятном людям языке(каждой
дали название.пример простой  дос программы выводящей сообщение:

; fasm example of
writing 16-bit COM program




















        org     100h    ;код стартует со
смещения 100h










       
use16           ;используем
16-битный код




















;Вывод текста = 9

 mov     ah,9;Помещаем в регистр ah значение Вывод текста









 mov     dx,hello;Помещаем
в dx адресс нащего текста









 int     21h ;Вызываем
21 прерывание









 int     20h ;Вызываем
21 прерывание-Выходим из программы

hello db ‘Hello world!’,24h;текст
 нашего  сообщения
)

.Вот тот же пример на C++:

#include <iostream.h>









int main()









{









   
cout
<< «Hello World!\n» ;









    return 0;









}

Затем стали
появлятся новые языки. Они развивались,приобретали популярность и умирали
забытые всеми,а Ассемблер сколько не пытались похоронить,каждый раз выживал .В
чём его секрет?Зачем он вообще нужен?

Вроде бы есть
столько языков-зачем нам нужен этот Ассемблер?Я думаю так думает основная масса
тех кто собрался учить новый язык.И начинают учить C,С++,Delphi и т.д.То что
«легче».На самом деле лёгкого языка.Что привлекает людей в C,C++?Это
масса халявы.Вам тут и куча библиотек где за вас уже накатали 80 процентов
программы,и гора справочных материалов,и примеры в изобилии.Тебе поручили
создать какуюто прогу-нет проблем.Порылся на свалках исходников,кое-что
переделал под себя(попросту испортил) и вот он наш шедевр,бежим за заслуженым
гонорором(или отметкой если вы студент).









Однако задумайтесь вот над чем.Те кто пользуется FreeBSD знают что загрузчик(та
фича с которой начинается загрузка ОС) этой замечательной ОС помещается в загрузочном
секторе(это крохотные 512 байт).Как вы думаете  на чём он написан?Конечно
на C!Ведь все UNIX’оиды пишутся на C.-Скажете вы.И сильно ошибётесь.Такой
маленький загрузчик может быть написан только на Ассемблере.Вот реальный
пример:




























































1.Программа на Fasm написаная под DOS(*.COM)

















 22 байт

















2.Программа на Fasm написаная под DOS(*.EXE)

















59 байт

















3.Программа на С++ написаная под DOS(*.EXE)

















23 160 байт









Кстати C не намного
лучще.Если вы хотите получить маленькую и шуструю программу-вам необходим
Ассемблер.Вот для чего он используется:

  • все, что требует максимальной скорости выполнения: основные компоненты компьютерных игр,
    ядра операционных систем реального времени и просто критические участки
    программ;
  • все, что взаимодействует с внешними устройствами: драйверы, программы, работающие
    напрямую с портами, звуковыми и видеоплатами;
  • все, что использует полностью возможности процессора: ядра многозадачных операционных систем,
    DPMI-серверы и вообще любые программы, переводящие процессор в защищенный
    режим;
  • все, что полностью использует возможности операционной системы: вирусы и
    антивирусы, защиты от несанкционированного доступа, программы, обходящие
    эти защиты, и программы, защищающиеся от этих программ;
  • и многое другое.

Между прочем уже есть Операционные системы полностью
написаные на Ассемблере(MenuetOS,SolarOS,Miraculix и др.).Они быстро
развиваются и в будущем продемонстрируют миру на что способен Ассемблер.Кроме
того программ написаных на Ассемблере стаёт больше с каждым днём.Появились
среды разработки(IDE),библиотеки для облегчения написания программ,Сайты
посвященные написанию программ на Asm в различных ОС(Windows,DOS,Linux,FreeBsd
и др.)Если вы хотите написать первокласную программу,операционную
сиситему,драйвер,антивирус,классный вирус,кряк,патч,или keygen вам Ассемблер
необходим(но и про С/C++ не забывайте).









Я думаю с этим ясно,переходим к тому что нам будет нужно для изучения этого
великого и могучего богатыря.

Я думаю не секрет что  новичок всегда хочет  получить
программу не затрачивая больших усилий.Поэтому мы будем изучать Win32
програмирование на Fasm.









В ближайщее время мы узнаем:









1.Как вывести MessageBox.Стили MessageBox.









2.Создаём  обыкновенное окно.(прога будет иметь свою иконку).









3.Создаём диалоговое окно.









5.Выводим надпись(используя нужный нам шрифт).









4.Выводим картинку(используя BitBlt,StrechBlt и TransparentBlt).









5.Получаем время и выводим его на окно.









6.Проигрываем MP3,WAV,MIDI файлы.









7.Создаём непрямоугольные окна.









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








с
этим.Ещё я научу вас писать программы отображающие XP стили.

Постигаем Си глубже, используя ассемблер / Хабр

Вдохновением послужила эта статья: Разбираемся в С, изучая ассемблер. Продолжение так и не вышло, хотя тема интересная. Многие бы хотели писать код и понимать, как он работает. Поэтому я запущу цикл статей о том, как выглядит Си-код после декомпиляции, попутно разбирая основные структуры кода.

От читающих потребуются хотя бы базовые знания в следующих вещах:

  • регистры процессора
  • стек
  • представление чисел в компьютере
  • синтаксис ассемблера и Си

Но если у вас их нет, а тема вам интересна, то все это можно быстро загуглить в процессе чтения статьи. Статья не рассчитана совсем уж на новичков, но я старательно разжевывал многие простые вещи, чтобы новичкам было от чего отталкиваться.

Что будем использовать?

  1. Нам понадобится компилятор Си, который поддерживает современный стандарт. Можно воспользоваться онлайн компилятором на сайте ideone.com.
  2. Так же нам нужен декомпилятор, опять же, можно воспользоваться онлайн декомпилятором на сайте godbolt.org.
  3. Можно так же взять компилятор для ассемблера, который есть на ideone по ссылке выше.

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

При более основательном подходе к изучению, лучше пользоваться оффлайн версиями компиляторов, можете взять связку из актуального gcc, OllyDbg и NASM. Отличия должны быть минимальны.

Простейшая программа

Эта статья не стремится повторить ту, которую я приводил в самом начале. Но начинать нужно с азов, поэтому часть материала будет вынуждено пересекаться. Надеюсь на понимание.

Первое, что нужно усвоить, компилятор даже при оптимизации нулевого уровня (-O0), может вырезать код, написанный программистом. Поэтому код следующего вида:

int main(void) 
{
	5 + 3;
	return 0;
}

Ничем не будет отличаться от:

int main(void) 
{
	return 0;
}

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

Второе, нам нужны флаги компиляции. Достаточно двух: -O0 и -m32. Этим мы задаем нулевой уровень оптимизации и 32-битный режим. С оптимизаций должно быть очевидно: нам не хочется видеть интерпретацию нашего кода в asm, а не оптимизированного. С режимом тоже должно быть очевидно: меньше регистров — больше внимания к сути. Хотя эти флаги я буду периодически менять, чтобы углубляться в материал.

Таким образом, если вы пользуетесь gcc, то компиляция может выглядеть так:

gcc source.c -O0 -m32 -o source

Соответственно, если вы пользуетесь godbolt, то вам нужно указать эти флаги в строку ввода рядом с выбором компилятора. (Первые примеры я демонстрирую на gcc 4.4.7, потом поменяю на более поздний)

Теперь, можно посмотреть первый пример:

int main(void) 
{
	register int a = 1; //записываем в регистровую переменную 1
	return a; //возвращаем значение из регистровой переменной
}

Итак, следующий код соответствует этому:

push 		ebp
mov 		ebp, esp

push 		ebx
mov 		ebx, 1
mov 		eax, ebx

pop 		ebx
pop 		ebp
ret

Первые две строчки соответствую прологу функции (точнее три, но третью хочу пояснить сейчас), и мы их разберем в статье о функциях. Сейчас просто не обращайте на них внимание, тоже самое касается последних 3х строчек. Если вы не знаете asm, давайте смотреть, что означают эти команды.

Инструкции ассемблера имеют вид:

mnemonic dst, src

т. е.

инструкция получатель, источник

Тут нужно оговориться, что AT&T-синтаксис имеет другой порядок, и потом мы к нему еще вернемся, но сейчас нас интересует синтаксис схожий с NASM.

Начнем с инструкции mov. Эта инструкция перемещает из памяти в регистры или из регистров в память. В нашем случае она перемещает число 1 в регистр ebx.

Давайте кратко о регистрах: в архитектуре x86 восемь 32х битных регистров общего назначения, это значит, что эти регистры могут быть использованы программистом (в нашем случае компилятором) при написании программ. Регистры ebp, esp, esi и edi компилятор будет использовать в особых случаях, которые мы рассмотрим позже, а регистры eax, ebx, ecx и edx компилятор будет использовать для всех остальных нужд.

Таким образом mov ebx, 1, прямо соответствует строке register int a = 1;

И означает, что в регистр ebx было перемещено значение 1.

А строчка mov eax, ebx, будет означать, что в регистр eax будет перемещено значение из регистра ebx.

Есть еще две строчки push ebx и pop ebx. Если вы знакомы с понятием «стек», то догадываетесь, что сначала компилятор поместил ebx в стек, тем самым запомнил старое значение регистра, а после окончания работы программы, вернул из стека это значение обратно в регистр ebx.

Почему компилятор помещает значение 1 из регистра ebx в eax? Это связано с соглашением о вызовах функций языка Си. Там несколько пунктов, все они нас сейчас не интересуют. Важно то, что результат возвращается в eax, если это возможно. Таким образом понятно, почему единица в итоге оказывается в eax.

Но теперь логичный вопрос, а зачем понадобился ebx? Почему нельзя было написать сразу mov eax, 1? Все дело в уровне оптимизации. Я же говорил: компилятор не должен вырезать наш код, а мы написали не return 1, мы использовали регистровую переменную. Т. е. компилятор сначала поместил значение в регистр, а затем, следуя соглашению, вернул результат. Поменяйте уровень оптимизации на любой другой, и вы увидите, что регистр ebx, действительно, не нужен.

Кстати, если вы пользуетесь godbolt, то вы можете наводить мышкой на строку в Си, и вам подсветится соответствующий этой строке код в asm, при условии, что эта строка выделена цветом.

Стек

Усложним пример и перестанем пользоваться регистровыми переменными (Вы же их нечасто используете?). Посмотрим во что превратится такой код:

int main(void) 
{
	int a = 1; //записываем в переменную 1
	int b = a + 5; //прибавим к 'a' 5 и сораним в 'b'
	return b; //возвращаем значение из переменной
}

ASM:

push 		ebp
mov 		ebp, esp
sub 		esp, 16

mov 		DWORD PTR [ebp-8], 1
mov 		eax, DWORD PTR [ebp-8]
add 		eax, 5
mov 		DWORD PTR [ebp-4], eax
mov 		eax, DWORD PTR [ebp-4]

leave
ret

Опять же, пропустим верхние 3 строчки и нижние 2. Теперь у нас переменная а локальная, следовательно память ей выделяется на стеке. Поэтому мы видим следующую магию: DWORD PTR [ebp-8], что же она означает? DWORD PTR — это переменная типа двойного слова. Слово — это 16 бит. Термин получил распространение в эпоху 16-ти битных процессоров, тогда в регистр помещалось ровно 16 бит. Такой объем информации стали называть словом (word). Т. е. в нашем случае dword (double word) 2*16 = 32 бита = 4 байта (обычный int).

В регистре ebp содержится адрес на вершину стека для текущей функции (мы к этому еще вернемся, потом), поэтому он смещается на 4 байта, чтобы не затереть сам адрес и дописывает значение нашей переменной. Только, в нашем случае он смещается на 8 байт для переменной a. Но если вы посмотрите на код ниже, то увидите, что переменная b лежит со смещением в 4 байта. Квадратные скобки означают адрес. Т. е. это строка работает следующим образом: на основе адреса, хранящегося в ebp, компилятор помещает значение 1 по адресу ebp-8 размера 4 байта. Почему минус восемь, а не плюс. Потому что плюсу бы соответствовали параметры, переданные в эту функцию, но опять же, обсудим это позже.

Следующая строка перемещает значение 1 в регистр eax. Думаю, это не нуждается в подробных объяснениях.

Далее у нас новая инструкция add, которая осуществляет добавление (сложение). Т. е. к значению в eax (1) добавляется 5, теперь в eax находится значение 6.

После этого нужно переместить значение 6 в переменную b, что и делается следующей строкой (переменная b находится в стеке по смещению 4).

Наконец, нам нужно вернуть значение переменной b, следовательно нужно переместить

значение в регистр eax (mov eax, DWORD PTR [ebp-4]).

Если с предыдущим все понятно, то можно переходить, к более сложному.

Интересные и не очень очевидные вещи.

Что произойдет, если мы напишем следующее: int var = 2.5;

Каждый из вас, я думаю, ответит верно, что в var будет значение 2. Но что произойдет с дробной частью? Она отбросится, проигнорируется, будет ли преобразование типа? Давайте посмотрим:

ASM:

mov DWORD PTR [ebp-4], 2

Компилятор сам отбросил дробную часть за ненадобностью.

Что произойдет, если написать так: int var = 2 + 3;

ASM:

mov DWORD PTR [ebp-4], 5

И мы узнаем, что компилятор сам способен вычислять константы. А в данном случае: так как 2 и 3 являются константами, то их сумму можно вычислить на этапе компиляции. Поэтому можно не забивать себе голову вычислением таких констант, компилятор может сделать работу за вас. Например, перевод в секунды из часов можно записать, как hours * 60 * 60. Но скорее, в пример тут стоит поставить операции над константами, которые объявлены в коде.

Что произойдет, если напишем такой код:

int a = 1;
int b = a * 2;
mov 		DWORD PTR [ebp-8], 1
mov 		eax, DWORD PTR [ebp-8]
add 		eax, eax
mov 		DWORD PTR [ebp-4], eax

Интересно, не правда ли? Компилятор решил не пользоваться операцией умножения, а просто сложил два числа, что и есть — умножить на 2. (Я уже не буду подробно описывать эти строки, вы должны понять их, исходя из предыдущего материала)

Вы могли слышать, что операция «умножение» выполняется дольше, чем операция «сложение». Именно по этим соображениям компилятор оптимизирует такие простые вещи.

Но усложним ему задачу и напишем так:

int a = 1;
int b = a * 3;

ASM

mov DWORD PTR [ebp-8], 1
mov edx, DWORD PTR [ebp-8]
mov eax, edx
add eax, eax
add eax, edx
mov DWORD PTR [ebp-4], eax

Пусть вас не вводит в заблуждение использование нового регистра edx, он ничем не хуже eax или ebx. Может понадобиться время, но вы должны увидеть, что единица попадает в регистр edx, затем в регистр eax, после чего значение eax складывается само с собой и после уже добавляется еще одна единица из edx. Таким образом, мы получили 1+1+1.

Знаете, бесконечно он так делать не будет, уже на *4, компилятор выдаст следующее:

mov DWORD PTR [ebp-8], 1
mov eax, DWORD PTR [ebp-8]
sal eax, 2
mov DWORD PTR [ebp-4], eax
mov eax, 0

Итак, у нас новая инструкция sal, что же она делает? Это двоичный сдвиг влево. Эквивалентно следующему коду в Си:

int a = 1;
int b = a << 2;

Для тех, кто не очень понимает, как работает этот оператор:

0001 сдвигаем влево (или добавляем справа) на два нуля: 0100 (т. е. 4 в 10ой системе счисления). По своей сути сдвиг влево на 2 разряда — это умножение на 4.

Забавно, что если вы умножите на 5, то компилятор сделает один sal и один add, можете сами потестировать разные числа.

На 22, компилятор на godbolt.org сдается и использует умножение, но до этого числа он пытается выкрутиться самыми разными способами. Даже вычитание использует и еще некоторые инструкции, которые мы еще не обсуждали.

Ладно, это были цветочки, а что вы думаете по поводу следующего кода:

int a = 2;
int b = a / 2;

Если вы ожидаете вычитания, то увы — нет. Компилятор будет выдавать более изощренные методы. Операция «деление» еще медленнее умножения, поэтому компилятор будет также выкручиваться:

mov 		DWORD PTR [ebp-4], 2
mov 		eax, DWORD PTR [ebp-4]
mov 		edx, eax
shr 		edx, 31
add 		eax, edx
sar 		eax
mov 		DWORD PTR [ebp-8], eax

Следует сказать, что для этого кода я выбрал компилятор существенно более поздней версии (gcc 7.2), до этого я приводил в пример gcc 4.4.7. Для ранних примеров существенных отличий не было, для этого примера они используют разные инструкции в 5ой строчке кода. И пример, сгенерированный 7.2, мне сейчас легче вам объяснить.

Стоит обратить внимание, что теперь переменная a находится в стеке по смещению 4, а не 8 и сразу же забыть об этом незначительном отличии. Ключевые моменты начинаются с mov edx, eax. Но пока пропустим значение этой строки. Инструкция shr осуществляет двоичный сдвиг вправо (т. е. деление на 2, если бы было shr edx, 1). И тут некоторые смогут подумать, а почему, действительно, не написать shr edx, 1, это же то, что делает код в Си? Но не все так просто.

Давайте проведем небольшую оптимизацию и посмотрим на что это повлияет. В действительности, мы нашим кодом выполняем целочисленное деление. Так как переменная «a» является целочисленным типом и 2 константа типа int, то результат никак не может получиться дробным по логике Си. И это хорошо, так как делить целочисленные числа быстрее и проще, но у нас знаковые числа, а это значит, что отрицательное число при делении инструкцией shr может отличаться на единицу от правильного ответа. (Это все из-за того, что 0 влезает по середине диапазона для знаковых типов). Если мы заменим знаковое деление на unsigned:

unsigned int a = 2;
unsigned int b = a / 2;

То получим ожидаемое. Стоит учесть, что godbolt опустит единицу в инструкции shr, и это не скомпилируется в NASM, но она там подразумевается. Измените 2 на 4, и вы увидите второй операнд в виде 2.

Теперь посмотрим на предыдущий код. В нем мы видим sar eax, это то же самое, что и shr, только для знаковых чисел. Остальной же код просто учитывает эту единицу, когда мы делим отрицательное число (или на отрицательное число, хотя код немного изменится). Если вы знаете, как представляются отрицательные числа в компьютере, вам будет не трудно догадаться, почему мы делаем сдвиг вправо на 31 разряд и добавляем это значение к исходному числу.

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

Заключение

Для первой статьи материала уже больше, чем достаточно. Пора закруглятся и подводить итоги. Мы ознакомились с базовым синтаксисом ассемблера, выяснили, что компилятор может брать на себя простейшие оптимизации при вычислениях. Увидели разницу между регистровыми и стековыми переменными. И некоторые другие вещи. Это была вводная статья, пришлось много времени уделять очевидным вещам, но они очевидны не для всех, в будущем мы постигнем больше тонкостей языка Си.

Часть 2

Ассемблер — Википедия

Эта статья — о компьютерных программах. О языке программирования см. Язык ассемблера.

Ассе́мблер (от англ. assembler — сборщик) — транслятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке.

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

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

Архитектура x86

Ассемблеры для DOS

Наиболее известными ассемблерами для операционной системы DOS являлись Borland Turbo Assembler (TASM), Microsoft Macro Assembler (MASM) и Watcom Assembler (WASM). Также в своё время был популярен простой ассемблер A86.

Windows

При появлении операционной системы Windows появилось расширение TASM, именуемое TASM 5+ (неофициальный пакет, созданный человеком с ником !tE’), позволившее создавать программы для выполнения в среде Windows. Последняя известная версия TASM — 5.3, поддерживающая инструкции MMX, на данный момент включена в Turbo C++ Explorer. Но официально развитие программы полностью остановлено. Последнее развитие компилятор получил благодаря современной среде разработки TASM Visual. Среда неофициальная, но с её помощью работа с компилятором многократно упрощается.

Microsoft поддерживает свой продукт под названием Microsoft Macro Assembler. Она продолжает развиваться и по сей день, последние версии включены в наборы DDK. Но версия программы, направленная на создание программ для DOS, не развивается. Кроме того, Стивен Хатчессон создал пакет для программирования на MASM под названием «MASM32».

GNU и Linux

В состав операционной системы GNU входит пакет binutils, включающий в себя ассемблер gas (GNU Assembler), использующий AT&T-синтаксис, в отличие от большинства других популярных ассемблеров, которые используют Intel-синтаксис (поддерживается с версии 2.10).

Переносимые ассемблеры

Также существует открытый проект ассемблера, версии которого доступны под различные операционные системы, и который позволяет получать объектные файлы для этих систем. Называется этот ассемблер NASM (Netwide Assembler).

Yasm — это переписанная с нуля версия NASM под лицензией BSD (с некоторыми исключениями).

flat assembler (fasm) — молодой ассемблер под модифицированной для запрета перелицензирования (в том числе под GNU GPL) BSD-лицензией. Есть версии для KolibriOS, Linux, DOS и Windows; использует Intel-синтаксис и поддерживает инструкции x86-64.

Архитектуры RISC

MCS-51

MCS-51 (Intel 8051) — классическая архитектура микроконтроллера. Для неё существует кросс-ассемблер ASM51, выпущенный корпорацией MetaLink.

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

Пример программы на языке ASM-51 для микроконтроллера AT89S52:

 
mov SCON, #50h
mov Th2, #0FDh
orl TMOD, #20h
setb TR1
again:
  clr RI
  jnb RI, $
  mov A, SBUF
  jnb RI, $
  clr TI
  mov SBUF, A
  jnb TI, $
sjmp again

Данная программа отправляет обратно полученный символ, через последовательный порт UART.

AVR

На данный момент для AVR существуют 4 компилятора производства Atmel (AVRStudio 3, AVRStudio 4, AVRStudio 5 и AVRStudio 6).

В рамках проекта AVR-GCC (он же WinAVR) существует компилятор avr-as (это портированный под AVR ассемблер GNU as из GCC).

Также существует свободный минималистический компилятор avra[1].

Платные компиляторы: IAR (EWAVR), CodeVisionAVR, Imagecraft. Данные компиляторы поддерживают языки Assembler и C, а IAR ещё и C++.

Существует компилятор с языка BASIC — BASCOM, также платный.

ARM

Для процессоров ARM существует достаточно широкий выбор компиляторов, внутренняя реализация которых зависит от непосредственно производителя данного ARM-процессора либо разработчика IDE для работы с ARM-процессорами. Официальным компилятором ARM, непосредственно от компании ARM, является ARM Compiler 6, который входит в IDE DS-5 Development Studio и поддерживает компиляцию программ на языках Си и С++.
Компиляторы от поставщиков ARM процессоров и разработчиков ARM toolchain:


Примеры компиляции С в ARM Assembler
Битовые операции

Си:

ASM:

ADR r4,a ; get address for a
LDR r0,[r4] ; get value of a
MOV r0,r0,LSL#2 ; perform shift
ADR r4,b ; get address for b
LDR r1,[r4] ; get value of b
AND r1,r1,#15 ; perform AND
ORR r1,r0,r1 ; perform OR
ADR r4,z ; get address for z
STR r1,[r4] ; store value for z
Ветвления

Си:

if (i == 0)
{
    i = i + 10;
}

ASM:

@(переменная i находится в регистре R1)
SUBS R1, R1, #0
ADDEQ R1, R1, #10
Циклы

Си:

for ( i = 0 ; i < 15 ; i++)
{
    j = j + j;
}

ASM:

      SUB R0, R0, R0 ; i -> R0 and i = 0
start CMP R0, #15 ; is i < 15?
      ADDLT R1, R1, R1 ; j = j + j
      ADDLT R0, R0, #1 ; i++
      BLT start

PIC

Пример программы на языке ассемблера для микроконтроллера PIC16F628A (архитектура PIC):

 
        LIST    p=16F628A
         __CONFIG 0309H 
 
STATUS  equ     0x003
TRISB   equ     0x086
PORTB   equ     0x006
RP0     equ     5
        org  0
        goto start
start:
        bsf     STATUS,RP0             
        movlw   .00      
        movwf   TRISB                    
        bcf     STATUS,RP0        
led:
        movlw   .170   
        movwf   PORTB
        goto    led
end

AVR32

MSP430

Пример программы на языке Assembler для микроконтроллера MSP430G2231 (архитектура MSP, в среде Code Composer Studio):

 
 .cdecls C,LIST,  "msp430g2231.h"
;------------------------------------------------------------------------------
            .text                           ; Program Start
;------------------------------------------------------------------------------
RESET       mov.w   #0280h,SP               ; Initialize stackpointer
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL  ; Stop WDT
SetupP1     bis.b   #001h,&P1DIR            ; P1.0 output
                                            ;				          			
Mainloop    bit.b   #010h,&P1IN             ; P1.4 hi/low?
            jc      ON                      ; jmp--> P1.4 is set
                                            ;
OFF         bic.b   #001h,&P1OUT            ; P1.0 = 0 / LED OFF
            jmp     Mainloop                ;
ON          bis.b   #001h,&P1OUT            ; P1.0 = 1 / LED ON
            jmp     Mainloop                ;
                                            ;
;------------------------------------------------------------------------------
;           Interrupt Vectors
;------------------------------------------------------------------------------
            .sect   ".reset"                ; MSP430 RESET Vector
            .short  RESET                   ;
            .end

PowerPC

Программный пакет The PowerPC Software Development Toolset от IBM включает в себя ассемблер для PowerPC.

MIPS

Макроассемблер

Не следует путать с MASM.

Макроассемблер (от греч. μάκρος — большой, обширный) — макропроцессор, базовым языком которого является язык ассемблера[2].

Ассемблирование и компилирование

Процесс трансляции программы на языке ассемблера в объектный код принято называть ассемблированием. В отличие от компилирования, ассемблирование — более или менее однозначный и обратимый процесс. В языке ассемблера каждой мнемонике соответствует одна машинная инструкция, в то время как в языках программирования высокого уровня за каждым выражением может скрываться большое количество различных инструкций. В принципе, это деление достаточно условно, поэтому иногда трансляцию ассемблерных программ также называют компиляцией.

См. также

Примечания

Литература

  • Вострикова З. П. Программирование на языке ассемблера ЕС ЭВМ. М.: Наука, 1985.
  • Галисеев Г. В. Ассемблер для Win 32. Самоучитель. — М.: Диалектика, 2007. — С. 368. — ISBN 978-5-8459-1197-1.
  • Зубков С. В. Ассемблер для DOS, Windows и UNIX. — М.: ДМК Пресс, 2006. — С. 608. — ISBN 5-94074-259-9.
  • Ирвин Кип. Язык ассемблера для процессоров Intel = Assembly Language for Intel-Based Computers. — М.: Вильямс, 2005. — С. 912. — ISBN 0-13-091013-9.
  • Калашников О. А. Ассемблер? Это просто! Учимся программировать. — БХВ-Петербург, 2011. — С. 336. — ISBN 978-5-9775-0591-8.
  • Магда Ю. С. Ассемблер. Разработка и оптимизация Windows-приложений. СПб.: БХВ-Петербург, 2003.
  • Нортон П., Соухэ Д. Язык ассемблера для IBM PC. М.: Компьютер, 1992.
  • Владислав Пирогов. Ассемблер для Windows. — СПб.: БХВ-Петербург, 2002. — 896 с. — ISBN 978-5-9775-0084-5.
  • Владислав Пирогов. Ассемблер и дизассемблирование. — СПб.: БХВ-Петербург, 2006. — 464 с. — ISBN 5-94157-677-3.
  • Сингер М. Мини-ЭВМ PDP-11: Программирование на языке ассемблера и организация машины. М.: Мир, 1984.
  • Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера. М.: Радио и связь, 1989.
  • Юров В., Хорошенко С. Assembler: учебный курс. — СПб.: Питер, 2000. — С. 672. — ISBN 5-314-00047-4.

Ассемблер — это… Что такое Ассемблер?

Эта статья — о компьютерных программах. О языке программирования см. Язык ассемблера.

Ассе́мблер (от англ. assembler — сборщик) — компьютерная программа, компилятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке.

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

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

Архитектура x86

Ассемблеры для DOS

Наиболее известными ассемблерами для операционной системы DOS являлись Borland Turbo Assembler (TASM), Microsoft Macro Assembler (MASM) и Watcom Assembler (WASM). Также в своё время был популярен простой ассемблер A86.

Windows

При появлении операционной системы Windows появилось расширение TASM, именуемое TASM 5+ (неофициальный пакет, созданный человеком с ником !tE), позволившее создавать программы для выполнения в среде Windows. Последняя известная версия TASM — 5.3, поддерживающая инструкции MMX, на данный момент включена в Turbo C++ Explorer. Но официально развитие программы полностью остановлено.

Microsoft поддерживает свой продукт под названием Microsoft Macro Assembler. Она продолжает развиваться и по сей день, последние версии включены в наборы DDK. Но версия программы, направленная на создание программ для DOS, не развивается. Кроме того, Стивен Хатчессон создал пакет для программирования на MASM под названием «MASM32».

GNU и GNU/Linux

В состав операционной системы GNU входит пакет binutils, включающий в себя ассемблер gas (GNU Assembler), использующий AT&T-синтаксис, в отличие от большинства других популярных ассемблеров, которые используют Intel-синтаксис (поддерживается с версии 2.10).

Переносимые ассемблеры

Также существует открытый проект ассемблера, версии которого доступны под различные операционные системы, и который позволяет получать объектные файлы для этих систем. Называется этот ассемблер NASM (Netwide Assembler).

Yasm — это переписанная с нуля версия NASM под лицензией BSD (с некоторыми исключениями).

flat assembler (fasm) — молодой ассемблер под модифицированной для запрета перелицензирования (в том числе под GNU GPL) BSD-лицензией. Есть версии для KolibriOS, Linux, DOS и Windows; использует Intel-синтаксис и поддерживает инструкции x86-64.

Архитектуры RISC

MCS-51

MCS-51 (Intel 8051) — классическая архитектура микроконтроллера. Для неё существует кросс-ассемблер ASM51, выпущенный корпорацией MetaLink.

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

AVR

На данный момент существуют 3 компилятора производства Atmel (AVRStudio 3, AVRStudio 4, AVRStudio 5 и AVRStudio 6).

В рамках проекта AVR-GCC (он же WinAVR) существует компилятор avr-as (это портированный под AVR ассемблер GNU as из GCC).

Также существует свободный минималистический компилятор avra[1].

ARM

PIC

Пример программы на языке Assembler для микроконтроллера PIC16F628A:

 
        LIST    p=16F628A
         __CONFIG 0309H 
 
STATUS  equ     0x003
TRISB   equ     0x086
PORTB   equ     0x006
RP0     equ     5
        org  0
        goto start
start:
        bsf     STATUS,RP0             
        movlw   .00      
        movwf   TRISB                    
        bcf     STATUS,RP0        
led:
        movlw   .170   
        movwf   PORTB
        goto    led
end

AVR32

MSP430

Пример программы на языке Assembler для микроконтроллера MSP430G2231 (в среде Code Composer Studio):

 
 .cdecls C,LIST,  "msp430g2231.h"
;------------------------------------------------------------------------------
            .text                           ; Program Start
;------------------------------------------------------------------------------
RESET       mov.w   #0280h,SP               ; Initialize stackpointer
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL  ; Stop WDT
SetupP1     bis.b   #001h,&P1DIR            ; P1.0 output
                                            ;                                                           
Mainloop    bit.b   #010h,&P1IN             ; P1.4 hi/low?
            jc      ON                      ; jmp--> P1.4 is set
                                            ;
OFF         bic.b   #001h,&P1OUT            ; P1.0 = 0 / LED OFF
            jmp     Mainloop                ;
ON          bis.b   #001h,&P1OUT            ; P1.0 = 1 / LED ON
            jmp     Mainloop                ;
                                            ;
;------------------------------------------------------------------------------
;           Interrupt Vectors
;------------------------------------------------------------------------------
            .sect   ".reset"                ; MSP430 RESET Vector
            .short  RESET                   ;
            .end

PowerPC

Программный пакет The PowerPC Software Development Toolset от IBM включает в себя ассемблер для PowerPC.

MIPS

Архитектуры MISC

SeaForth

Существуют:

  • 8-разрядные Flash-контроллеры семейства MCS-51
  • 8-разрядные RISC-контроллеры семейства AVR (ATtiny, ATmega, classic AVR). На данный момент семейство classic AVR трансформировано в ATtiny и ATmega
  • 8-разрядные RISC-контроллеры семейства PIC (PIC10,PIC12,PIC16,PIC18)
  • 16-разрядные RISC-контроллеры семейства PIC (PIC24HJ/FJ,dsPIC30/33)
  • 32-разрядные RISC-контроллеры семейства PIC (PIC32) с архитектурой MIPS32 M4K
  • 32-разрядные RISC-контроллеры семейства AVR32 (AVR32)
  • 32-разрядные RISC-контроллеры семейства ARM Thumb высокой производительности (серия AT91)

Макроассемблер

Не следует путать с MASM.

Макроассемблер (от греч. μάκρος — большой, обширный) — макропроцессор, базовым языком которого является язык ассемблера.[2]

Ассемблирование и компилирование

Процесс трансляции программы на языке ассемблера в объектный код принято называть ассемблированием. В отличие от компилирования, ассемблирование — более или менее однозначный и обратимый процесс. В языке ассемблера каждой мнемонике соответствует одна машинная инструкция, в то время как в языках программирования высокого уровня за каждым выражением может скрываться большое количество различных инструкций. В принципе, это деление достаточно условно, поэтому иногда трансляцию ассемблерных программ также называют компиляцией.

Примечания

См. также

Литература

  • Вострикова З. П. Программирование на языке ассемблера ЕС ЭВМ. М.: Наука, 1985.
  • Галисеев Г. В. Ассемблер для Win 32. Самоучитель. — М.: Диалектика, 2007. — С. 368. — ISBN 978-5-8459-1197-1
  • Зубков С. В. Ассемблер для DOS, Windows и UNIX.
  • Кип Ирвина. Язык ассемблера для процессоров Intel = Assembly Language for Intel-Based Computers. — М.: Вильямс, 2005. — С. 912. — ISBN 0-13-091013-9
  • Калашников О. А. Ассемблер? Это просто! Учимся программировать. — БХВ-Петербург, 2011. — С. 336. — ISBN 978-5-9775-0591-8
  • Магда Ю. С. Ассемблер. Разработка и оптимизация Windows-приложений. СПб.: БХВ-Петербург, 2003.
  • Нортон П., Соухэ Д. Язык ассемблера для IBM PC. М.: Компьютер, 1992.
  • Владислав Пирогов. Ассемблер для Windows. — СПб.: БХВ-Петербург, 2002. — 896 с. — ISBN 978-5-9775-0084-5
  • Владислав Пирогов. Ассемблер и дизассемблирование. — СПб.: БХВ-Петербург, 2006. — 464 с. — ISBN 5-94157-677-3
  • Сингер М. Мини-ЭВМ PDP-11: Программирование на языке ассемблера и организация машины. М.: Мир, 1984.
  • Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера. М.: Радио и связь, 1989.
  • Юров В., Хорошенко С. Assembler: учебный курс. — СПб.: Питер, 2000. — С. 672. — ISBN 5-314-00047-4
  • Юров В. И. Assembler: учебник для вузов / 2-е изд. СПб.: Питер, 2004.
  • Юров В. И. Assembler. Практикум: учебник для вузов / 2-е изд. СПб.: Питер, 2004.
  • Юров В. И. Assembler. Специальный справочник. СПб.: Питер, 2000.

Ссылки

C vs Assembler | Электроника для всех

Если ты впервые столкнулся с микроконтроллерами, то наверняка у тебя стал выбор на чем писать.

На Си или на Ассемблере. Выбор не прост, не зря программисты однокристальщики раскололись на два непримиримых лагеря. Одни с пеной у рта доказывают, что те кто пишут на Си лохи изнеженные, а настоящий брутальный кодер должен воспринимать только ассемблер. Другие же, усераясь, доказывают, что на ассемблере разве что лампочками помигать можно, а какой либо серьезный проект делать на низком уровне невозможно.

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

Assembler+
Парадоксально, но под микроконтроллеры писать на ассемблере ничуть не сложней чем на Си. В самом деле, программирование контроллера неотделимо от его железа. А когда пишешь на ассемблере, то обращаешься со всей периферией контроллера напрямую, видишь что происходит и как это происходит. Главное, что при этом ты четко понимаешь что, как и зачем ты делаешь. Очень легко отлаживать и работа программы как на ладони.
Да и сам ассемблер изучается очень быстро, за считанные дни. Достаточно постоянно иметь перед глазами систему команд и навык программирования алгоритмов. А соответствующее состояние мозга, когда начинаешь мыслить ассемблерными конструкциями наступает очень быстро.

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

Напомню, что у AVR, как и подавляющего числа МК, память разделена на код и данные и адреса у них в разных адресных пространствах о которых стандарт Си ничего не знает, ведь он расчитан на некий универсальный вычислитель. А тут приходится вводить всякие модификаторы, квалификаторы и без яростного курения мануалов разобраться в этих примочках бывает очень сложно. Особенно работа с памятью осложняется тем, что программа то работает в том и другом случае, но вот если неправильно указать тип памяти, то оперативка забьется константами и в дальнейшем программу скрючит в самый неподходящий момент. Вот и найди такой глюк

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

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

В таких случаях обычно открывают листинг и смотрят что там происходит в коде на уровне команд процессора, но вот засада — без знания ассемблера там делать нечего! Зато если понимаешь то как работает программа на уровне команд, то найти багу вроде срыва стека или нарушения атомарного доступа проще простого.

Ну и такие гадкие вещи как overhead. Программа на Си требует значительно больше оперативной памяти, значительно больше места во flash памяти, работает куда медленней чем ассемблерная программа. И если на обычном компьютере с его гигагерцами частот, гигабайтами оперативки и дисковой памяти это не столь критично, то вот для контроллера с жалкими килобайтами флеша, у которого частота порой не превышает 16 мегагерц, а оперативки и килобайта не наберется, такой расход ресурсов более чем критичен.

Кроме того существуют такие контроллеры как ATTiny 1x у которых либо вообще нет оперативки, либо она такая мизерная, что даже стек там сделан аппаратным. Так что на Си там ничего написать в принципе нельзя.

Assembler+
Представь, что ты прораб, а компилятор это банда джамшутов. И вот надо проделать дырку в стене. Даешь ты джамшутам отвертку и говоришь — ковыряйте. Проковряют они отверткой бетонную стену? Конечно проковыряют, вопрос лишь времени и прочности отвертки. Отвертка сточится (читай памяти процессора или быстродействия не хватит)? Не беда — дадим джамшутам отвертку побольше, благо разница в цене между большой отверткой и маленькой копеечная. В самом деле, зачем прорабу, руководителю, знать такие низкоуровневые тонкости, как прочность и толщина бетонной стены, типы инструмента. Главное дать задание и проконтроллировать выполнение, а джамшуты все сделают сами.
Задача решается? Да! Эффективно это решение? Совершенно нет! А почему? А потому что прораб не знал, что бетон твердый и отверткой его проковырять сложно. А будь прораб сам когда то рабочим, пусть даже не профи, но своими руками положил плитку, посверлил дырки, то впредь таких идиотских заданий бы не давал. Конечно, нашего прораба можно и в шараге выучить, дав ему всю теорию строения стен, инструмента, материалов. Но ты представь сколько это сухой теории придется перелопатить, чтобы чутье было интуитивным, на уровне спинного мозга? Проще дать в руки инструмент и отправить сверлить стены. Практика — лучший учитель.

Также и с ассемблером. Хочешь писать эффективные программы на высокоуровневом языке — изучи хотя бы один ассемблер, попиши на нем немного. Чтобы потом, глядя на любую Сишную строку, представлять себе во что это в итоге компилируется и как обрабатывается контроллером. Очень помогает в отладке и написании, а уж про ревесирование чужих программ я вообще не говорю.

Assembler-
Но засиживаться в ассемблерщиках и стараться все сделать на нем далеко не обязательно. Ассемблерный код тяжелей переносить с контроллера на контроллер, в нем при переносе можно наделать много незначительных, но тем не менее фатальных ошибок. Отладка которых занимает много времени. Большие проекты писать на ассемблере то еще развлечение. На ассемблере трудно сделать полноценную библиотеку, подключаемую куда угодно. Ассемблер жестко привязан к конкретному семейству контроллеров.

С+
Си хорош за счет огромного числа готового кода, который можно очень легко и удобно подключать и использовать в своих нуждах. За большую читабельность алгоритмов. За возможность взять и перетащить код, например, с AVR на ARM без особых заморочек. Или с AVR на PIC. Разумеется для этого надо уметь ПРАВИЛЬНО писать на Си, выделяя все аппаратно зависимые части в HAL.

Общий расклад примерно таков, что использование высокоуровневого языка на контроллерах с обьемом памяти меньше 8 килобайт является избыточным. Тут эффективней писать все на Ассемблере. Особенно если проект подразумевает не просто мигание светодиодом.
8-16 килобайт тут уже зависит от задачи, а вот пытаться писать на ассемблере прошивку более 16 килобайт можно, но это напоминает прокладку тоннеля под Ла Маншем с помощью зубила.

В общем, знать надо и то и другое. Настоятельно тебе рекомендую начать изучать МК с ассемблера. А как только поймешь, что на асме можешь реализовать все что угодно, любой алгоритм. Когда досконально прочувствуешь работу стека, прерываний, организацию переходов и ветвлений. Когда разные трюки и хитрости, вроде игр с адресами возврата из прерываний и процедур, переходами и конечными автоматами на таблицах и всякие извраты будут вызывать лишь интерес, но никак не взрыв мозга из серии «Аааа как это работает??? Не понимаю?!!»
Вот тогда и можно изучать Си. Причем, изучать его с дебагером в руках. Не просто изучить синтаксис (там то как раз все элементарно), а понять ЧТО и КАК делает компилятор из твоего исходника. Поржать над его тупостью или наоборот поудивляться извратам искуственного интелекта. Понять как компилятор делает ветвления, как организует циклы, как идет работа с разными типами данных, как ведется оптимизация. Где ему лучше помочь, написав в ассемблерном стиле, а где не критично и можно во всю ширь использовать языковые возможности Си.

А вот начать изучение ассемблера после Си мало кому удается. Си расслабляет, становится лень и впадлу. Скомпилировалось? Работает? Ну и ладно. А то что там быдлокод, та пофигу… =)

А как же бейсик, паскаль и прочие языки? Они тоже есть на AVR?
Конечно есть, например BascomAVR или MicroPASCAL и во многих случаях там все проще и приятней. Не стоит прельщаться видимой простотой. Она же обернется тем, что потом все равно придется переходить на Си.

Дело в том, что мир микроконтроллеров далеко не ограничивается одним семейством. Постоянно появляются новые виды контроллеров, развиваются новые семейства. Ведь кроме AVR есть еще и ARM, PIC, STM8 и еще куча прекрасных контроллеров со своими плюсами.
И под каждый из этих семейств есть Си компилятор. Ведь Си это, по сути, промышленный стандарт. Он есть везде и контроллер который не имеет под него компилятора популярным у профессионалов не станет никогда.

А вот на бейсик с паскалем, обычно, всем пофигу. Если на AVR и PIC эти компиляторы и сделали, то лишь потому, что процы эти стали особо популярны у любителей и там наверняка найдется тот, кто заинтересуется и бейсиками всякими. С другим семейством контроллеров далеко не факт, что будет также радужно. Например под STM8 или Cortex M3 я видел Pascal в лучшем случае только в виде кривых студенческих поделок. Никак не тянущих на нормальный компилятор.

Такой разный Си
С Си тоже не все гладко. Тут следует избегать компиляторов придумывающих свои диалектные фишки. Например, CodeVision AVR (CVAVR) позволяет обращаться к битам порта с помощью такого кода:

1
PORTB.7 = 1; 		// Выставить бит 7 порта B в 1

PORTB.7 = 1; // Выставить бит 7 порта B в 1

Удобно? Конечно удобно! Вот только в Си так делать нельзя, стандарт языка не позволяет. И ни один другой Си компилятор такой кусок кода не примет. Т.к. по стандарту корректней будет так:

Использование диалектов не позволит тебе скакать с компилятора на компилятор. Таскать код повсюду копипастом. Привязывает к одному конкретному компилятору и далеко не факт, что он окажется хорошим и будет поддерживать все новые контроллеры семейства.

Приплюснутый
Некоторое время назад я считал, что С++ в программировании микроконтроллеров не место. Слишком большой overhead. C тех пор мое мнение несколько поменялось.
Мне показали очень красивый кусок кода на С++, который компилился вообще во что то феерическое. Компактней и быстрей я бы и на ассемблере не факт что написал. А уж про читабельность и конфигурируемость и говорить не приходится. Все из знакомых программистов, кто видел этот код, говорили что-то вроде «Черт, а я то думал, что я знаю С++».

Так что писать на С++ можно! Но сделать компактный и быстрый код на С++ чертовски виртуозная задача, надо знать этот самый С++ в совершенстве. Судя по тому, что столь качественных примеров эффективности С++ при программировании под МК мне попадалось раз-два, то видимо пороговый уровень входа в эту область весьма и весьма велик.

В общем, как говорил Джон Кармак, «хороший С++ код лучше чем хороший С код. Но плохой С++ может быть намного ужасней чем плохой С код».

Ассемблер. Условия | Уроки Ассемблера

  Обновл. 16 Ноя 2019  | 

К условиям в ассемблере относятся инструкции циклов и ветвления. Эти инструкции могут изменять поток выполнения кода в программе.

Типы прыжков

Есть 2 типа выполнения условий в ассемблере:

   Прыжок без условия (или ещё «безусловный прыжок») — выполняется инструкцией JMP. Выполнение данной инструкции часто включает передачу управления в адрес инструкции, которая не следует за выполняемой в настоящее время инструкцией. Результатом передачи управления может быть выполнение нового набора инструкций или повторное выполнение текущих инструкций.

   Прыжок с условием (или ещё «условный прыжок») — выполняется с помощью инструкций типа J<условие> и зависит от самого условия. Условные инструкции, изменяя значение смещения в регистре IP, передают управление, прерывая последовательный поток выполнения кода.

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

Инструкция CMP

Инструкция CMP (от англ. «COMPARE») сравнивает два операнда. Фактически, она выполняет операцию вычитания между двумя операндами для проверки того, равны ли эти операнды или нет. Используется вместе с инструкцией условного прыжка.

Синтаксис инструкции CMP:

CMP назначение, источник

Инструкция CMP сравнивает два числовых поля. Операнд назначения может находиться либо в регистре, либо в памяти. Исходным операндом (источник) могут быть константы, регистры или память.

Например:

CMP DX, 00 ; сравниваем значение регистра DX с нулём
JE L7 ; если true, то переходим к метке L7
.
.
L7: …



CMP DX, 00  ; сравниваем значение регистра DX с нулём

JE  L7      ; если true, то переходим к метке L7

.

.

L7: …

Инструкция CMP часто используется для проверки того, достигла ли переменная-счётчик максимального количества раз выполнения цикла или нет.

Например:

INC EDX
CMP EDX, 10 ; сравниваем, достиг ли счётчик 10 или нет
JLE LP1 ; если его значение меньше или равно 10, то тогда переходим к LP1



INC EDX

CMP EDX, 10 ; сравниваем, достиг ли счётчик 10 или нет

JLE LP1     ; если его значение меньше или равно 10, то тогда переходим к LP1

Прыжок без условия

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

JMP    label

В следующем примере мы рассмотрим использование инструкции JMP:

MOV AX, 00 ; инициализируем регистр AX значением 0
MOV BX, 00 ; инициализируем регистр BX значением 0
MOV CX, 01 ; инициализируем регистр CX значением 1
L20:
ADD AX, 01 ; выполняем инкремент регистра AX
ADD BX, AX ; добавляем AX к BX
SHL CX, 1 ; сдвиг влево регистра CX, что, в свою очередь, удваивает значение регистра CX
JMP L20 ; повторно выполняем стейтменты



MOV  AX, 00    ; инициализируем регистр AX значением 0

MOV  BX, 00    ; инициализируем регистр BX значением 0

MOV  CX, 01    ; инициализируем регистр CX значением 1

L20:

ADD  AX, 01    ; выполняем инкремент регистра AX

ADD  BX, AX    ; добавляем AX к BX

SHL  CX, 1     ; сдвиг влево регистра CX, что, в свою очередь, удваивает значение регистра CX

JMP  L20       ; повторно выполняем стейтменты

Прыжок с условием

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

Ниже приведены инструкции условного прыжка, используемые для данных со знаком в арифметических операциях:

ИнструкцияОписаниеТестируемые флаги
JE/JZJump Equal (равно) или Jump Zero (ноль)ZF
JNE/JNZJump Not Equal (не равно) или Jump Not Zero (не ноль)ZF
JG/JNLEJump Greater (больше) или Jump Not Less/Equal (не меньше/равно)OF, SF, ZF
JGE/JNLJump Greater/Equal (больше/равно) или Jump Not Less (не меньше)OF, SF
JL/JNGEJump Less (меньше) или Jump Not Greater/Equal (не больше/равно)OF, SF
JLE/JNGJump Less/Equal (меньше/равно) или Jump Not Greater (не больше)OF, SF, ZF

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

ИнструкцияОписаниеТестируемые флаги
JE/JZJump Equal (равно) или Jump Zero (ноль)ZF
JNE/JNZJump Not Equal (не равно) или Jump Not Zero (не ноль)ZF
JA/JNBEJump Above (больше) или Jump Not Below/Equal (не меньше/равно)CF, ZF
JAE/JNBJump Above/Equal (больше/равно) или Jump Not Below (не меньше)CF
JB/JNAEJump Below (меньше) или Jump Not Above/Equal (не больше/равно)CF
JBE/JNAJump Below/Equal (меньше/равно) или Jump Not Above (не больше)AF, CF

Следующие инструкции условного прыжка имеют специальное использование и проверяют значение флагов:

ИнструкцияОписаниеТестируемые флаги
JCXZJump если CX равно Zeronone
JCJump если Carry (перенос)CF
JNCJump если No Carry (нет переноса)CF
JOJump если Overflow (переполнение)OF
JNOJump если No Overflow (нет переполнения)OF
JP/JPEJump Parity или Jump Parity Even (если чётность)PF
JNP/JPOJump No Parity или Jump Parity Odd (если нечётность)PF
JSJump Sign (отрицательное значение)SF
JNSJump No Sign (положительное значение)SF

Пример синтаксиса набора инструкций типа J<условие>:

CMP AL, BL
JE EQUAL
CMP AL, BH
JE EQUAL
CMP AL, CL
JE EQUAL
NON_EQUAL: …
EQUAL: …



CMP AL, BL

JE EQUAL

CMP AL, BH

JE EQUAL

CMP AL, CL

JE EQUAL

NON_EQUAL: …

EQUAL: …

В качестве примера, рассмотрим следующую программу, которая определяет и выводит на экран наибольшую из трёх целочисленных переменных:

section .text
global _start ; должно быть объявлено для использования gcc

_start: ; сообщаем линкеру входную точку
mov ecx, [num1]
cmp ecx, [num2]
jg check_third_num
mov ecx, [num2]

check_third_num:

cmp ecx, [num3]
jg _exit
mov ecx, [num3]

_exit:

mov [largest], ecx
mov ecx,msg
mov edx, len
mov ebx,1 ; файловый дескриптор (stdout)
mov eax,4 ; номер системного вызова (sys_write)
int 0x80 ; вызов ядра

mov ecx,largest
mov edx, 2
mov ebx,1 ; файловый дескриптор (stdout)
mov eax,4 ; номер системного вызова (sys_write)
int 0x80 ; вызов ядра

mov eax, 1
int 80h

section .data

msg db «The largest digit is: «, 0xA,0xD
len equ $- msg
num1 dd ’47’
num2 dd ’22’
num3 dd ’31’

segment .bss
largest resb 2


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

section .text

   global _start         ; должно быть объявлено для использования gcc

 

_start:                  ; сообщаем линкеру входную точку

   mov   ecx, [num1]

   cmp   ecx, [num2]

   jg    check_third_num

   mov   ecx, [num2]

  

check_third_num:

 

   cmp   ecx, [num3]

   jg    _exit

   mov   ecx, [num3]

  

_exit:

  

   mov   [largest], ecx

   mov   ecx,msg

   mov   edx, len

   mov   ebx,1 ; файловый дескриптор (stdout)

   mov   eax,4 ; номер системного вызова (sys_write)

   int   0x80 ; вызов ядра

   mov   ecx,largest

   mov   edx, 2

   mov   ebx,1 ; файловый дескриптор (stdout)

   mov   eax,4 ; номер системного вызова (sys_write)

   int   0x80 ; вызов ядра

    

   mov   eax, 1

   int   80h

 

section .data

  

   msg db «The largest digit is: «, 0xA,0xD

   len equ $- msg

   num1 dd ’47’

   num2 dd ’22’

   num3 dd ’31’

 

segment .bss

   largest resb 2

Результат выполнения программы выше:

The largest digit is:
47

Оценить статью:

Загрузка…

Поделиться в социальных сетях:

Ассемблер — Википедия. Что такое Ассемблер

Эта статья — о компьютерных программах. О языке программирования см. Язык ассемблера.

Ассе́мблер (от англ. assembler — сборщик) — транслятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке.

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

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

Архитектура x86

Ассемблеры для DOS

Наиболее известными ассемблерами для операционной системы DOS являлись Borland Turbo Assembler (TASM), Microsoft Macro Assembler (MASM) и Watcom Assembler (WASM). Также в своё время был популярен простой ассемблер A86.

Windows

При появлении операционной системы Windows появилось расширение TASM, именуемое TASM 5+ (неофициальный пакет, созданный человеком с ником !tE’), позволившее создавать программы для выполнения в среде Windows. Последняя известная версия TASM — 5.3, поддерживающая инструкции MMX, на данный момент включена в Turbo C++ Explorer. Но официально развитие программы полностью остановлено. Последнее развитие компилятор получил благодаря современной среде разработки TASM Visual. Среда неофициальная, но с её помощью работа с компилятором многократно упрощается.

Microsoft поддерживает свой продукт под названием Microsoft Macro Assembler. Она продолжает развиваться и по сей день, последние версии включены в наборы DDK. Но версия программы, направленная на создание программ для DOS, не развивается. Кроме того, Стивен Хатчессон создал пакет для программирования на MASM под названием «MASM32».

GNU и Linux

В состав операционной системы GNU входит пакет binutils, включающий в себя ассемблер gas (GNU Assembler), использующий AT&T-синтаксис, в отличие от большинства других популярных ассемблеров, которые используют Intel-синтаксис (поддерживается с версии 2.10).

Переносимые ассемблеры

Также существует открытый проект ассемблера, версии которого доступны под различные операционные системы, и который позволяет получать объектные файлы для этих систем. Называется этот ассемблер NASM (Netwide Assembler).

Yasm — это переписанная с нуля версия NASM под лицензией BSD (с некоторыми исключениями).

flat assembler (fasm) — молодой ассемблер под модифицированной для запрета перелицензирования (в том числе под GNU GPL) BSD-лицензией. Есть версии для KolibriOS, Linux, DOS и Windows; использует Intel-синтаксис и поддерживает инструкции x86-64.

Архитектуры RISC

MCS-51

MCS-51 (Intel 8051) — классическая архитектура микроконтроллера. Для неё существует кросс-ассемблер ASM51, выпущенный корпорацией MetaLink.

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

Пример программы на языке ASM-51 для микроконтроллера AT89S52:

 
mov SCON, #50h
mov Th2, #0FDh
orl TMOD, #20h
setb TR1
again:
  clr RI
  jnb RI, $
  mov A, SBUF
  jnb RI, $
  clr TI
  mov SBUF, A
  jnb TI, $
sjmp again

Данная программа отправляет обратно полученный символ, через последовательный порт UART.

AVR

На данный момент для AVR существуют 4 компилятора производства Atmel (AVRStudio 3, AVRStudio 4, AVRStudio 5 и AVRStudio 6).

В рамках проекта AVR-GCC (он же WinAVR) существует компилятор avr-as (это портированный под AVR ассемблер GNU as из GCC).

Также существует свободный минималистический компилятор avra[1].

Платные компиляторы: IAR (EWAVR), CodeVisionAVR, Imagecraft. Данные компиляторы поддерживают языки Assembler и C, а IAR ещё и C++.

Существует компилятор с языка BASIC — BASCOM, также платный.

ARM

Для процессоров ARM существует достаточно широкий выбор компиляторов, внутренняя реализация которых зависит от непосредственно производителя данного ARM-процессора либо разработчика IDE для работы с ARM-процессорами. Официальным компилятором ARM, непосредственно от компании ARM, является ARM Compiler 6, который входит в IDE DS-5 Development Studio и поддерживает компиляцию программ на языках Си и С++.
Компиляторы от поставщиков ARM процессоров и разработчиков ARM toolchain:


Примеры компиляции С в ARM Assembler
Битовые операции

Си:

ASM:

ADR r4,a ; get address for a
LDR r0,[r4] ; get value of a
MOV r0,r0,LSL#2 ; perform shift
ADR r4,b ; get address for b
LDR r1,[r4] ; get value of b
AND r1,r1,#15 ; perform AND
ORR r1,r0,r1 ; perform OR
ADR r4,z ; get address for z
STR r1,[r4] ; store value for z
Ветвления

Си:

if (i == 0)
{
    i = i + 10;
}

ASM:

@(переменная i находится в регистре R1)
SUBS R1, R1, #0
ADDEQ R1, R1, #10
Циклы

Си:

for ( i = 0 ; i < 15 ; i++)
{
    j = j + j;
}

ASM:

      SUB R0, R0, R0 ; i -> R0 and i = 0
start CMP R0, #15 ; is i < 15?
      ADDLT R1, R1, R1 ; j = j + j
      ADDLT R0, R0, #1 ; i++
      BLT start

PIC

Пример программы на языке ассемблера для микроконтроллера PIC16F628A (архитектура PIC):

 
        LIST    p=16F628A
         __CONFIG 0309H 
 
STATUS  equ     0x003
TRISB   equ     0x086
PORTB   equ     0x006
RP0     equ     5
        org  0
        goto start
start:
        bsf     STATUS,RP0             
        movlw   .00      
        movwf   TRISB                    
        bcf     STATUS,RP0        
led:
        movlw   .170   
        movwf   PORTB
        goto    led
end

AVR32

MSP430

Пример программы на языке Assembler для микроконтроллера MSP430G2231 (архитектура MSP, в среде Code Composer Studio):

 
 .cdecls C,LIST,  "msp430g2231.h"
;------------------------------------------------------------------------------
            .text                           ; Program Start
;------------------------------------------------------------------------------
RESET       mov.w   #0280h,SP               ; Initialize stackpointer
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL  ; Stop WDT
SetupP1     bis.b   #001h,&P1DIR            ; P1.0 output
                                            ;				          			
Mainloop    bit.b   #010h,&P1IN             ; P1.4 hi/low?
            jc      ON                      ; jmp--> P1.4 is set
                                            ;
OFF         bic.b   #001h,&P1OUT            ; P1.0 = 0 / LED OFF
            jmp     Mainloop                ;
ON          bis.b   #001h,&P1OUT            ; P1.0 = 1 / LED ON
            jmp     Mainloop                ;
                                            ;
;------------------------------------------------------------------------------
;           Interrupt Vectors
;------------------------------------------------------------------------------
            .sect   ".reset"                ; MSP430 RESET Vector
            .short  RESET                   ;
            .end

PowerPC

Программный пакет The PowerPC Software Development Toolset от IBM включает в себя ассемблер для PowerPC.

MIPS

Макроассемблер

Макроассемблер (от греч. μάκρος — большой, обширный) — макропроцессор, базовым языком которого является язык ассемблера[2].

Ассемблирование и компилирование

Процесс трансляции программы на языке ассемблера в объектный код принято называть ассемблированием. В отличие от компилирования, ассемблирование — более или менее однозначный и обратимый процесс. В языке ассемблера каждой мнемонике соответствует одна машинная инструкция, в то время как в языках программирования высокого уровня за каждым выражением может скрываться большое количество различных инструкций. В принципе, это деление достаточно условно, поэтому иногда трансляцию ассемблерных программ также называют компиляцией.

См. также

Примечания

Литература

  • Вострикова З. П. Программирование на языке ассемблера ЕС ЭВМ. М.: Наука, 1985.
  • Галисеев Г. В. Ассемблер для Win 32. Самоучитель. — М.: Диалектика, 2007. — С. 368. — ISBN 978-5-8459-1197-1.
  • Зубков С. В. Ассемблер для DOS, Windows и UNIX. — М.: ДМК Пресс, 2006. — С. 608. — ISBN 5-94074-259-9.
  • Ирвин Кип. Язык ассемблера для процессоров Intel = Assembly Language for Intel-Based Computers. — М.: Вильямс, 2005. — С. 912. — ISBN 0-13-091013-9.
  • Калашников О. А. Ассемблер? Это просто! Учимся программировать. — БХВ-Петербург, 2011. — С. 336. — ISBN 978-5-9775-0591-8.
  • Магда Ю. С. Ассемблер. Разработка и оптимизация Windows-приложений. СПб.: БХВ-Петербург, 2003.
  • Нортон П., Соухэ Д. Язык ассемблера для IBM PC. М.: Компьютер, 1992.
  • Владислав Пирогов. Ассемблер для Windows. — СПб.: БХВ-Петербург, 2002. — 896 с. — ISBN 978-5-9775-0084-5.
  • Владислав Пирогов. Ассемблер и дизассемблирование. — СПб.: БХВ-Петербург, 2006. — 464 с. — ISBN 5-94157-677-3.
  • Сингер М. Мини-ЭВМ PDP-11: Программирование на языке ассемблера и организация машины. М.: Мир, 1984.
  • Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера. М.: Радио и связь, 1989.
  • Юров В., Хорошенко С. Assembler: учебный курс. — СПб.: Питер, 2000. — С. 672. — ISBN 5-314-00047-4.

Что делает Ассемблер? (с иллюстрациями)

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

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

Чтение чертежей и схем — обычная часть работы сборщика. Для выполнения своей работы она использует машины или ручные инструменты, а иногда и их комбинацию. Работа часто повторяется и всегда требует внимания к деталям, чтобы гарантировать единообразие и качество готового продукта.

Сборщики часто работают на сборочных линиях.

Раньше сборщик почти всегда работал на сборочной линии. В последние годы тенденция в сборочных операциях отошла от линейного производства. Сегодня основная часть производственно-монтажных работ выполняется командой рабочих и создает целый продукт или несколько связанных компонентов. Члены команды меняют работу.Это широко считается эффективным инструментом борьбы со скукой и выгоранием на рабочем месте при одновременном повышении качества производства.

Некоторые монтажники выполняют работу на месте.

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

Для работы с домкратами для поддонов могут потребоваться сборщики.

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

Электромонтажник может устанавливать электрические системы в ракеты.

Сборщики обычно должны помочь в обслуживании и ремонте оборудования, которое они используют. Знакомство с оборудованием помогает им выявлять неисправности оборудования до того, как они повлияют на большую часть процесса сборки. Он также помогает сборщику обучать новых сотрудников процессам и ремонтировать оборудование в случае, если механик или машинист завода недоступен.

Большая часть обучения сборочным работам проходит на рабочем месте, и сборщики обычно должны иметь диплом об окончании средней школы или его эквивалент.Ассемблер также должен иметь базовые навыки математики, письма и чтения. Необходимы ловкость рук и способность ежедневно выполнять качественную работу в течение длительного периода времени. Хорошая зрительно-моторная координация помогает производить продукты быстро и без ошибок.

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

Что такое язык ассемблера? | Возможности

Введение в язык ассемблера

Assembly Language — это язык программирования низкого уровня. Это помогает в понимании языка программирования машинного кода. В компьютере есть ассемблер, который помогает преобразовать ассемблерный код в исполняемый файл машинного кода. Язык ассемблера предназначен для понимания инструкций и предоставления машинному языку для дальнейшей обработки. В основном это зависит от архитектуры системы, будь то операционная система или архитектура компьютера.

Язык ассемблера

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

Почему полезен язык ассемблера?

Ассемблер помогает программистам писать удобочитаемый код, почти похожий на машинный язык. Машинный язык сложно понять и прочитать, так как это просто набор чисел.Язык ассемблера помогает обеспечить полный контроль над задачами, которые выполняет компьютер.

Пример:

Выполните следующие действия, чтобы распечатать «Hello world» в Windows

.

  1. Откройте блокнот.
  2. Напишите ниже код

global _main
extern _printf
section .text
_main:
push-сообщение
call _printf
add esp, 4
ret
message:
db 'Hello, World!', 10, 0

  1. Сохраните файл с любым именем, например XYZ.asm, расширение должно быть «.asm».
  2. Указанный выше файл необходимо скомпилировать с помощью ассемблера NASM (Netwide Assembler).
  3. Выполните команду nasm –f win32 XYZ.asm
  4. После этого Nasm создает один объектный файл, содержащий машинный код, но не исполняемый код, который является XYZ.obj
  5. Для создания исполняемого файла для Windows используется Minimal GNU, который предоставляет компилятор GCC.
  6. Выполните команду gcc –o XYZ.exe XYZ.obj
  7. Запустить исполняемый файл сейчас «XYZ»
  8. Вывод будет выглядеть как «Hello, world».

Почему вы должны изучать язык ассемблера?

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

Изучение языка ассемблера помогает понять функции процессора и памяти.Если программист пишет какую-либо программу, которая должна быть компилятором, это означает, что программист должен иметь полное представление о процессоре. Язык ассемблера помогает понять работу процессора и памяти. Это загадочный и символический язык.

.

Assembly — OSDev Wiki

До самого ядра компьютера каждый сигнал, посылаемый в любую часть машины, представляет собой серию электрических импульсов. Если электрический импульс высокий, например 5 вольт, это означает, что отправляется двоичная 1 цифра. Если электрический импульс низкий, например 0 вольт, это означает, что отправляется двоичный 0. Сложите 4 двоичных цифры вместе, и вы получите кусочек. Сложив 8 вместе, вы получите байт. Сложите 16 вместе, вы получите слово. Компьютеры понимают команды в таких сегментах, но люди этого не хотят.Поэтому они разработали лучший способ просмотра такой информации, и это было в шестнадцатеричном формате. Во-первых, для отображения одной команды не потребовалось 16 символов и в целом стало удобнее запоминать такие команды, как:

 90 - Нет работы
CC - перерыв
E9 - 16-битный переход
CD - прерывание
и т.п.
 

Но вскоре стало понятно, что такие коды должны быть удобными для пользователя, поэтому они изобрели ассемблерный код. С помощью ассемблерного кода вы можете представлять операции с помощью специальных кодов, которые более удобочитаемы.Например, произошел скачок JMP, прерывание INT, NOP не выполнял никаких действий и т. Д.

Ассемблер — это программа, которая читает файл сборки (обычно с расширением .asm) и преобразует его в двоичный исполняемый файл. Это очень похоже на компилятор, генерирующий исполняемую программу. Однако ассемблеры рассматриваются отдельно от компиляторов, потому что компиляторы скрывают низкоуровневые детали вашей системы, в то время как ассемблеры предоставляют вам эти детали.

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

Синтаксис сборки

В ассемблере за каждой инструкцией (или операцией / оператором / кодом операции) следует список параметров (или операндов), разделенных запятыми. Эти операнды могут быть либо непосредственными значениями (например, числами, такими как 1, 2, 0x16, 0101b), либо регистрами, либо ячейкой памяти. Например,

Инструкция mov, операнды eax и 123.Здесь eax — регистр, а 123 — непосредственное значение.

Существует два основных синтаксиса сборки: синтаксис Intel и синтаксис AT&T.

Intel Синтаксис

Вообще говоря, первый операнд операции является операндом-адресатом, а другой операнд (или операнды) является исходным операндом. Например:

Инструкция mov берет значение из исходного операнда и помещает его в целевой операнд, так что значение 123 будет помещено в регистр eax.Первоначальный синтаксис Intel — это ассемблер Intel ASM386 (позже переданный RadiSys по лицензии, но в конечном итоге исчез). С тех пор многие сборщики изобрели множество его вариаций. Кроме того, он используется в большинстве онлайн-руководств по сборке, потому что большинство этих руководств были написаны, когда TASM (который использует синтаксис Intel) был доминирующим ассемблером.

Синтаксис AT&T

Синтаксис AT&T является обратным синтаксису Intel. Данные, над которыми мы работаем, перемещаются слева направо.Вот тот же оператор, что и выше, в синтаксисе AT&T.

Есть и другие отличия от операндов:

  • Литеральные значения, такие как 123, имеют префикс «$» (см. Пример выше).
  • Ячейки памяти не имеют префикса: mov 123,% eax перемещает значение, хранящееся в 123, в eax.
  • Регистры имеют префикс ‘%’
  • При использовании регистра в качестве указателя он помещается в круглые скобки: mov (% eax),% ebx перемещает значение, сохраненное в указателе, хранящемся в eax, в ebx.
  • При использовании оператора с ячейками памяти (без регистра) после инструкции необходим суффикс. Например: movl $ 123, 123. ‘l’ (обозначает длинный) и нужен, чтобы сообщить ассемблеру, что значения 32-битные.
  • Указатели могут быть смещены константами путем добавления к ним префикса: 4 (% eax) указывает на 4 +% eax.
  • Указатели могут быть смещены другим регистром, записав их как: (% eax,% ebx), что указывает на% eax +% ebx
  • Наконец, вы можете объединить все это и добавить шкалу, если хотите: 4 (% eax,% ebx, 2) будет 4 +% eax +% ebx * 2

См. Также

Статьи

Внешние ссылки

  • GNU Binutils — коллекция программного обеспечения с открытым исходным кодом, включая ассемблер GNU (газ)
  • gas manual — Официальное руководство для ассемблера GNU (газ)
  • NASM — Официальный сайт Netwide Assembler: NASM
  • x86_Assembly — Викибук по написанию сборки для компьютеров на базе x86
  • Искусство программирования на ассемблере, электронная книга, 16-битное издание для DOS.(Более поздние выпуски сосредоточены на диалекте ассемблера высокого уровня, созданном автором.)
  • PC ASM, онлайн-книга, сборка 32-битного защищенного режима на x86
  • x86 Opcode and Instruction Reference, база данных инструкций и кодов операций в виде бесплатных просматриваемых, доступных для поиска и загружаемых файлов XML. Они также продают печатную версию.

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *