Асемблер за Linux за начинаещи: първата програма

Асемблерът, който ще използваме, е NASM (Netwide Assembler, nasm.2y.net). Този избор се дължи на факта, че:

Първо, той е мултиплатформен, т.е. за да пренесете програмата към различни операционни системи, трябва само да промените кода за взаимодействие със системата и не е необходимо да пренаписвате цялата програма.

Второ,това е, неговият синтаксис е последователен и недвусмислен, подобно на AT&T асемблер за UNIX?.

Трето,има обичайния синтаксис на Intel, т.е. MASM или TASM програмист ще може да премине към NASM без проблеми

Сега да преминем към първата програма:

Предишните три реда бяхадирективиасемблер, т.е. не са команди на процесора и не са преобразувани в машинен код по време на компилация. Следващите редове са точнокомандина процесора:

mov eax, 4- машинна инструкция MOV копира данни от втория операнд към първия. В този случай първият операнд еregisterEAX (повече за регистрите в следващия урок). Вторият операнд еконстанта(дефинирана по време на компилация и неизменна стойност). Резултатът от изпълнението на тази команда ще бъде, че в EAX регистъра ще бъде числото 4. Операндите на командата са разделени със запетая

mov ebx, 1- същото, но единица е поставена в EBX регистъра

mov ecx, msg- на пръв поглед тази команда се различава от предишните две, но също така извършва движение на данни, само че в този случай се използва константатаmsg, която е дефинирана по-долу и ECX регистъра

mov edx, msglen- съдържанието на дефинираната по-долу константаmsglenсе поставя в EDX регистъра

mov eax, 1- 1 се поставя в EAX - номерът на системното повикване "изход"

mov ebx, 0- поставете 0 в EBX -параметърът за извикване "exit" означавакод, с който ще приключи изпълнението на програмата

int 0x80- системно повикване. След системното повикване "изход" изпълнението на програмата приключва.

section .dataАсемблерната директиваsectionдефинира следните данни като в сегмента, определен като параметър. Сегмент.text-кодов сегмент, който трябва да съдържа изпълнимия код на програмата и четенето от който е забранено. Сегмент.data-сегмент от данни, в който трябва да се съхраняват данните на програмата. Изпълнението (прехвърлянето на контрол) към сегмента с данни е забранено. Тъй като следващите редове на нашата програма са данни, ние дефинираме сегмент от данни.

Резултатът от асемблера е обектен файл. Тъй като компилираме програмата под Linux, имаме нужда от обектен файл ELF (Executable and Linkable Format). Можете да го получите със следната команда:

Полученият обектен файл трябва да бъдесвързан. Това действие получи името си, защото може да се използва за свързване на няколко обектни файла в един изпълним файл. Ако има експортируеми функции или променливи в някой от обектните файлове, те са достъпни за всички свързани обектни файлове. Има функция, която винаги трябва да бъде дефинирана - това евходната точка- "_start". Тази функция стартира изпълнението на програмата. Оформление:

Тъй като не използваме никакви библиотеки, а взаимодействаме директно с ядрото на системата, когато свързваме, посочваме само нашия обектен файл.

След изпълнение на тази команда, файлът "prog01" ще бъде изпълнимият файл на нашата програма.