Привет. Помогите разобраться. Приводиться код на Асме для связе с СИ Т.е. процедура написанная на ассемблере должна вызываться из СИ. .MODEL MEDIUM .CODE PUBLIC _function_name _function_name PROC FAR push BP mov BP, SP ;работа функции pop BP _function_name ENDP END Не понимаю зачем нужны следующие манипуляции push BP mov BP, SP ... pop BP И зачем нужен PUBLIC _function_name Спасибо.
в учебниках это описано. bp использовать не обязательно. public - ключевое слово для обозначения видимости функции или переменной.
Привидите пример пожалуйста или дайте соотв. ссылку на ресурс. Я читаю секреты прогр. игр -Ламота, 94 года, он там ничего не рассказывает почему именно так. А просто пишет так. Где про это почитать? В Assembler Юров тоже ничего нету, чтоб понять эти действия Ламота.
NoName По-русски это называется "соглашение о связях" ( сексуально звучит сегодня). Любой нормальный учебник по Си(не Си за 21 день) содержит инфу об этом и многом другом. bp используется для удобства. Если ты в проге меняешь указатель стека, то тебе будет неудобно обращаться к переданным параметрам. Про регистр bp тоже в учебниках по Ассамблеру должно быть.
Параметры, передаваемые в процедуру, передаются через стек (ложатся в стек), а где именно находится вершина стека, указывается в регистре sp. Обратиться к любому параметру можно прочитав их по адресу, хранящемуся в sp + 2, sp + 4, sp + 6 и т.д. По адресу, хранящемуся в sp+0, находится адрес возврата из процедуры. Если в процедуре вдруг будут инструкции, манипулирующие указателем стека sp, например push, pop, call, то при выполнении этих инструкций sp будет меняться. И если после такого изменения понадобиться обратиться к параметрам, переданным в процедуру, то обращение произойдет не к тому месту в стеке, где лежат параметры, т.к. sp, адресующий вершину стека, был сбит. Чтобы не происходило этой путаницы с вершиной стека, принято на входе в процедуру сохранять в регистре bp тот указатель вершины стека. А т.к. bp тоже критически важен, и его нельзя просто так перетирать, то предварительно bp заталкивается в стек, а потом указатель стека записывается в bp. Это называется формирование стекового фрейма (типа слепок со стека). Теперь при манипуляциях с указателем стека sp, нет необходимости отслеживать где у нам там параметры. Т.к. теперь к параметрам будет обращение не относительно плавающего sp, а относительно стоящего на месте bp. И параметры, переданные в процедуру, будут находиться в фиксированных местах, по адресам: bp+4, bp+6, bp+8. Независимо от манипуляций с указателем стека sp/ По адресу bp+2 по прежнему адрес возврата из процедуры, по адресу в bp+0 лежит сохраненный старый bp. Такая вот система. Ну и естественно, на выходе из процедуры надо восстановить старое значение bp и sp (этот и делается инструкцией pop bp).
NoName Последний пост (перед этим) был бы абсолютно точным, если речь шла бы о 32-битном режиме (с заменой bp/sp на ebp/esp), но в 16-битном режиме нужно ещё учитывать, что адресации через sp просто нет (не существует опкода, соответствующего "mov ax,[sp+2]"), так что обращение через bp практически единственно возможное (формально говоря, можно писать также "mov bx/si/di,sp" и обращаться через bx/si/di, но тогда тратится лишний регистр и приходится явно писать префикс переопределения сегмента "ss:" при обращении). В учебнике Юрова этому (и смежным вопросам) посвящена целая глава, номер 14. Читай внимательнее.
diamond да и просто сам регистр (e)bp был изначально для этого предназначен. мы гдето уже разбирались в этом в старых темах несколько месяцев назад +)
[Offtop] А меня радует, что новички такие крутые вопросы задают И в праздники жизнь кипит на васме! И не только в праздники!
Чёт не пойму, почему он важен, зачем его предварительно сохранять, или там важная инфа храниться? Что может случиться, если это не сделать?
ajak попробую объяснить Код (Text): main ... интенсивно используем регистр bp/ebp ... call proc; также интенсивно использует bp/ebp при выходе из процедуры proc данные в bp/ebp будут испорчены, если в процедуре не было стандартного пролога push ebp/mov ebp,esp и стандартного эпилога pop ebp