Я попытался понять, как сделать простое программирование в сборке. Я перехожу к учебной программе hello world, и большая часть материала, который они объяснили, имеет смысл, но они действительно замалчивают ее. Я хотел бы помочь в понимании некоторых разных частей программы. Вот их учебный пример -Нужно руководствоваться пониманием базовой сборки
section .text
global main ;must be declared for linker (ld)
main: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!', 0xa ;our dear string
len equ $ - msg ;length of our dear string
Существует текстовый раздел и раздел данных. Секция данных, похоже, содержит информацию, определенную пользователем для программы. Похоже, что «кадр» программы находится в текстовом разделе, а «мясо» находится в разделе данных ...? Я предполагаю, что программа при компиляции выполняет текстовый раздел с данными из раздела данных, заполненного в текстовый раздел? Взаимодействие раздела bss/text/data немного чуждо мне. Также в разделе данных, где msg и len .... переменные? упомянуты, за ними следует некоторая информация, я не уверен, что делать. за msg следует db, что это значит? Затем текст, а затем 0xa, для чего нужен 0xa? Кроме того, за len следует equ, означает ли это значение равным? len равна переменной msign minus msg? Что такое знак доллара? Какой-то оператор? Кроме того, инструкции в текстовом разделе mov ebx, 1, по-видимому, или, кажется, говорят программе использовать STDOUT? Перемещает ли 1 в регистр ebx стандартную инструкцию для установки stdout?
Возможно, у кого-то есть более подробное руководство по рекомендации? Я ищу, чтобы стать грязным со сборкой и вам нужно научить себя некоторым из ... «основных принципов», если хотите. Спасибо за помощь!
Из любопытства, что побуждает вас учиться сборке? Я не критикую вас за то, что вы хотите, просто задаетесь вопросом, почему. Используя языки более высокого уровня, я лично не вижу необходимости изучать сборку. Я что-то упускаю? –
Раздел данных не вставлен в текстовый раздел, код может просто использовать данные по своему усмотрению. 'db' означает, что будут сырые байты, байты, представляющие строку« Hello, world! » за которым следует строка (0xa, шестнадцатеричная для 10, является линией в ascii). 'len equ $ - msg' означает« объявить len равным здесь минус msg »,« здесь минус msg »- это, конечно, количество байтов между ними, то есть длина строки. 'mov ebx, 1' просто устанавливает' ebx' в 1, но значение 1 означает STDOUT при использовании в качестве дескриптора файла. – harold
@wagregg, вам когда-нибудь приходилось работать на голых разработках любого типа? –