Ассемблер

В статье про трансляторы мы рассказали что происходит на этапах компиляции и интерпретации. Теперь расскажем, что происходит после запуска программы.

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

Это язык, который максимально приближен к машинному, соответственно к железу.
У разных архитектур и ОСок существуют свои диалекты и требования. На канале уже разбирался самый «общий» NASM, он работает на процессорах x86-64 на винде, маках и линуксе.

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

Области памяти

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

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

Исполнение кода

Перед запуском, находится начальная точка программы и запускается конвейер. Процессор считывает каждую строчку, расшифровывает и смотрит, что делать дальше: если в строке стоит ссылка, то он «двигает» ленту с кодом до ссылки; а если ссылки нет, то просто выполняет строку и читает следующую.

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

Поделиться
Отправить
Запинить
 77   1 мес   ассемблер
Популярное