Я бы хотел добавить к этому. Программы на компьютере обычно делятся на три части, хотя есть и другие.
Сегмент кода - .code, .text: http://en.wikipedia.org/wiki/Code_segment
В вычислениях, также сегмент кода
известный как текстовый сегмент или просто как
текст, это фраза, используемая для обозначения
часть памяти или объектного файла
который содержит исполняемые инструкции.
Он имеет фиксированный размер и обычно
только для чтения. Если текстовый раздел не
только для чтения, а затем
архитектура позволяет самоизменяться
код. Код только для чтения является реентерабельным, если
это может быть выполнено более чем одним
процесс в то же время. Как память
регион, сегмент кода находится в
нижние части памяти или в самом ее
дно, чтобы предотвратить кучу и
переполнение стека при его перезаписи.
Сегмент данных - .data: http://en.wikipedia.org/wiki/Data_segment
Сегмент данных является одним из разделов
программы в объектном файле или в
память, которая содержит глобальный
переменные и статические переменные, которые
инициализируются программистом. Это
имеет фиксированный размер, так как все
данные в этом разделе устанавливаются
программист перед программой
загружен. Тем не менее, это не только для чтения,
поскольку значения переменных могут
быть изменены во время выполнения. Это в
контраст по родате (постоянный,
данные только для чтения), а также
сегмент кода (также известный как текст
сегмент).
BSS: http://en.wikipedia.org/wiki/.bss
В компьютерном программировании .bss или bss
(который первоначально обозначал Блок
Started by Symbol) используется многими
компиляторы и компоновщики как имя
часть сегмента данных, содержащая
статические переменные и глобальные переменные
которые заполнены исключительно
данные с нулевым значением изначально (т. е.
когда начнется казнь). Это часто
упоминается как "раздел BSS" или
"BSS сегмент". Загрузчик программы
инициализирует память, выделенную для
раздел BSS, когда он загружает
программа.
Регистры, как описано другими, представляют собой средства ЦП для хранения данных или адреса памяти. Операции выполняются над регистрами, такими как add eax, ebx
и в зависимости от диалекта сборки, что означает разные вещи. В этом случае это означает добавление содержимого ebx в eax и сохранение его в eax (синтаксис NASM). Эквивалент в GNU AS (AT & T): movl $ebx, $eax
. Разные диалекты сборки имеют разные правила и операторы. По этой причине я не фанат MASM - он сильно отличается от NASM, YASM и GNU AS.
На самом деле нет никакого общего взаимодействия с C. ABI, как это происходит; например, в x86 (unix) вы найдете аргументы метода, помещенные в стек, тогда как в x86-64 в Unix первые несколько аргументов будут расположены в регистрах. Оба ABI ожидают, что результат функции будет сохранен в регистре eax / rax.
Вот 32-разрядная процедура добавления, которая собирается как для Windows, так и для Linux.
_Add
push ebp ; create stack frame
mov ebp, esp
mov eax, [ebp+8] ; grab the first argument
mov ecx, [ebp+12] ; grab the second argument
add eax, ecx ; sum the arguments
pop ebp ; restore the base pointer
ret
Здесь вы можете понять, что я имею в виду. Возвращаемое значение находится в eax. Версия x64, напротив, будет выглядеть так:
_Add
push rbp ; create stack frame
mov rbp, rsp
mov eax, edi ; grab the first argument
mov ecx, esi ; grab the second argument
add eax, ecx ; sum the arguments
pop rbp ; restore the base pointer
ret
Есть документы, которые определяют подобные вещи. Вот UNIX x64 ABI: http://www.x86 -64.org / Documentation / abi-0.99.pdf . Я уверен, что вы могли бы найти ABI для любого процессора, платформы и т. Д. Вам нужно.
Как вы работаете с массивом в сборке? Указатель арифметики. Учитывая базовый адрес в eax
, следующее сохраненное целое число будет в [eax+4]
, если целое число имеет размер 4 байта. Вы можете создать это пространство, используя вызовы до malloc / calloc, или вызвать системный вызов выделения памяти, что бы это ни было в вашей системе.
Что такое "куча"? Согласно Википедии, это область памяти, зарезервированная для динамического выделения памяти. Вы не увидите его в вашей программе сборки, пока не вызовете calloc, malloc или системный вызов выделения памяти, но он есть.
Извините за сочинение.