2013-06-12 5 views
1

Я попытался понять, как сделать простое программирование в сборке. Я перехожу к учебной программе 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?

Возможно, у кого-то есть более подробное руководство по рекомендации? Я ищу, чтобы стать грязным со сборкой и вам нужно научить себя некоторым из ... «основных принципов», если хотите. Спасибо за помощь!

+0

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

+2

Раздел данных не вставлен в текстовый раздел, код может просто использовать данные по своему усмотрению. 'db' означает, что будут сырые байты, байты, представляющие строку« Hello, world! » за которым следует строка (0xa, шестнадцатеричная для 10, является линией в ascii). 'len equ $ - msg' означает« объявить len равным здесь минус msg »,« здесь минус msg »- это, конечно, количество байтов между ними, то есть длина строки. 'mov ebx, 1' просто устанавливает' ebx' в 1, но значение 1 означает STDOUT при использовании в качестве дескриптора файла. – harold

+0

@wagregg, вам когда-нибудь приходилось работать на голых разработках любого типа? –

ответ

7

[NB - Я не знаю, какой ассемблерный диалект вы используете, поэтому я просто взял некоторые «лучшие догадки» в некоторых частях этого материала. Если кто-то может помочь прояснить, это будет здорово.]

Похоже, что «рамка» программы находится в текстовом разделе, а «мясо» находится в разделе данных ...?

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

Я предполагаю, что программа при компиляции выполняет текстовый раздел с данными из раздела данных, заполненного в текстовый раздел?

Программа (инструкции в текстовом разделе) обычно ссылается на символы и обрабатывает данные в разделе данных, если это то, о чем вы просите.

Взаимодействие раздела bss/text/data является для меня чужим.

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

Также в разделе данных, где msg и len .... переменные? упомянуты, за ними следует некоторая информация, я не уверен, что делать. за msg следует db, что это значит?

msg и len являются переменными рода, да. msg - глобальная переменная, указывающая на следующую строку: db означает data byte, что указывает на то, что ассемблер должен просто испускать последующие литералы. len устанавливается на длину строки (ниже).

Затем текст, а затем 0xa, для чего нужен 0xa?

0x0a - это шестнадцатеричное значение символа новой строки ASCII.

Кроме того, за len следует equ, означает ли это равное?

Да.

len equals dollarsign minus msg variable? Что такое знак доллара? Какой-то оператор?

$ означает «текущее местонахождение». Когда ассемблер выполняет свою работу, он отслеживает, сколько байтов данных и кода генерируется в счетчике. Таким образом, этот код говорит: «вычесть местоположение метки msg из текущего местоположения и сохранить этот номер как len». Поскольку «текущее местоположение» находится только за концом строки, вы получаете длину там.

Также инструкции в текстовом разделе mov ebx, 1, по-видимому, или, кажется, говорят программе использовать STDOUT? Перемещает ли 1 в регистр ebx стандартную инструкцию для установки stdout?

Программа выполняет системный вызов по инструкции int 0x80. До этого он должен установить все так, как ожидает ОС - в этом случае это выглядит как 1 в ebx1, что означает stdout, а также другие три регистра - длину сообщения в edx, указатель на сообщение в ecx и номер системного вызова в eax. Я бы предположил, что вы на Linux - вы можете найти таблицу системных вызовов из Google без особых проблем, я уверен.

Возможно, у кого-то есть более подробное руководство по рекомендации?

Извините, а не от макушки.

+0

Это отличная информация для меня, чтобы уйти, чтобы я мог собрать это вместе в моей голове. Такин 'детские шаги. Я определенно буду смотреть на ваш ответ, поскольку я работаю, чтобы понять каждую строку полностью в этом примере кода. Затем он переходит к большей головной боли, вызывающей код. Большое спасибо Карлу! – 0xhughes

+0

Нет проблем, дайте мне знать, если есть что-то, что я могу сформулировать, чтобы помочь вам в этом. –

+0

Возможные обучающие программы, представляющие интерес: http://www.drpaulcarter.com/pcasm - для вас недостаточно «низкого уровня», но работает на нескольких операционных системах. Другие (ориентированные на Linux) на http://asm.sourceforge.net - (это может быть то, что у вас есть). Если вы не используете Linux, ваш пример кода не будет работать ... но по-прежнему полезно изучить ... –

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