Как работает стек на ассемблере? - PullRequest
70 голосов
/ 17 февраля 2009

Я сейчас пытаюсь понять, как работает стек, поэтому я решил научить себя некоторому языку ассемблера , я использую эту книгу:

http://savannah.nongnu.org/projects/pgubook/

Я использую Gas ​​ и занимаюсь разработкой для Linux Mint .

Я немного смущен:

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

pushl
popl

Итак, при кодировании в сборке для архитектуры x86 и использовании синтаксиса Gas: стек - это просто структура данных, которая уже реализована? Или это на самом деле реализовано на аппаратном уровне? Или что-то еще? Также будет ли большинство языков ассемблера для других наборов микросхем уже реализовано в стеке?

Я знаю, что это немного глупый вопрос, но я на самом деле очень смущен этим.

Ответы [ 17 ]

1 голос
/ 10 декабря 2012

Что такое стек? Стек - это тип структуры данных - средство хранения информации в компьютере. Когда новый объект вводится в стек, он помещается поверх всех ранее введенных объектов. Другими словами, структура данных в стеке подобна пачке карточек, бумаг, рассылок по кредитным картам или любых других реальных объектов, о которых вы только можете подумать. При удалении объекта из стека, верхний объект удаляется первым. Этот метод называется LIFO (последний пришел, первый вышел).

Термин «стек» также может быть сокращенным для стека сетевых протоколов. В сети соединения между компьютерами осуществляются через серию меньших соединений. Эти соединения, или слои, действуют как структура данных стека в том смысле, что они создаются и удаляются одинаково.

0 голосов
/ 17 февраля 2009

Стек вызовов реализуется набором команд x86 и операционной системой.

Инструкции, такие как push и pop, корректируют указатель стека, в то время как операционная система заботится о распределении памяти по мере увеличения стека для каждого потока.

Тот факт, что стек x86 «уменьшается» с более высоких адресов на более низкие, делает эту архитектуру более подверженной атаке переполнения буфера.

0 голосов
/ 18 октября 2016

Я искал, как работает стек с точки зрения функций, и нашел этот блог его удивительный и объясняющий концепцию стека с нуля и как хранить стеки в стеке.

Теперь о вашем ответе. Я объясню на python, но вы получите хорошее представление о том, как работает стек на любом языке.

enter image description here

Это программа:

def hello(x):
    if x==1:
        return "op"
    else:
        u=1
        e=12
        s=hello(x-1)
        e+=1
        print(s)
        print(x)
        u+=1
    return e

hello(3)

enter image description here

enter image description here

Источник: Cryptroix

часть его темы, которую он освещает в блоге:

How Function work ?
Calling a Function
 Functions In a Stack
 What is Return Address
 Stack
Stack Frame
Call Stack
Frame Pointer (FP) or Base Pointer (BP)
Stack Pointer (SP)
Allocation stack and deallocation of stack
StackoverFlow
What is Heap?

Но это объясняется на языке Python, так что если хотите, можете взглянуть.

0 голосов
/ 17 февраля 2009

Вы правы в том, что стек является структурой данных. Часто структуры данных (включая стеки), с которыми вы работаете, являются абстрактными и существуют в виде представления в памяти.

Стек, с которым вы работаете, в этом случае имеет более материальное существование - он отображается непосредственно в реальные физические регистры процессора. В качестве структуры данных стеки являются структурами FILO (первым пришел, последним вышел), которые обеспечивают удаление данных в обратном порядке их ввода. Смотрите логотип StackOverflow для визуального! ;)

Вы работаете со стеком инструкций . Это стек фактических инструкций, которые вы подаете процессору.

0 голосов
/ 21 июля 2015

stack является частью памяти. он используется для input и output из functions. также используется для запоминания возврата функции.

esp регистр запоминает адрес стека.

stack и esp реализованы аппаратно. Также вы можете реализовать это самостоятельно. это сделает вашу программу очень медленной.

пример:

nop // esp = 0012ffc4

push 0 // esp = 0012ffc0, Dword [0012ffc0] = 00000000

call proc01 // esp = 0012ffbc, Dword [0012ffbc] = eip, eip = adrr [proc01]

pop eax // eax = Dword [esp], esp = esp + 4

0 голосов
/ 17 февраля 2009

Вы правы, что стек - это просто структура данных. Здесь, однако, это относится к аппаратно реализованному стеку, используемому для специальной цели - «Стек».

Многие люди высказались по поводу аппаратно реализованного стека в сравнении со структурой данных (программного) стека. Я хотел бы добавить, что существует три основных типа структуры стека -

  1. Стек вызовов - о котором вы спрашиваете! В нем хранятся параметры функций, адрес возврата и т. Д. Прочтите функции главы 4 (все о 4-й странице, т.е. страница 53) в этой книге. Есть хорошее объяснение.
  2. Общий стек Что вы могли бы использовать в своей программе, чтобы сделать что-то особенное ...
  3. Общий аппаратный стек
    Я не уверен в этом, но я помню, как где-то читал, что в некоторых архитектурах имеется аппаратно реализованный стек общего назначения. Если кто-нибудь знает, правильно ли это, пожалуйста, оставьте комментарий.

Первое, что нужно знать, это архитектура, для которой вы программируете, что объясняет книга (я только что посмотрел - ссылка). Чтобы по-настоящему понять вещи, я предлагаю вам узнать о памяти, адресации, регистрах и архитектуре x86 (я полагаю, это то, что вы изучаете - из книги).

0 голосов
/ 21 октября 2011

Вызов функций, для которых требуется сохранение и восстановление локального состояния в режиме LIFO (в отличие от, скажем, обобщенного совместного подхода), оказывается настолько невероятно распространенной потребностью, что языки ассемблера и архитектуры ЦП в основном строят эту функциональность в То же самое можно сказать и о понятиях потоков, защиты памяти, уровней безопасности и т. Д. Теоретически вы можете реализовать свой собственный стек, соглашения о вызовах и т. Д., Но я предполагаю, что некоторые коды операций и большинство существующих сред выполнения опираются на эту нативную концепцию "стек".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...