Связка asm+Cи -?

Тема в разделе "WASM.BEGINNERS", создана пользователем ajak, 29 апр 2008.

  1. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Привет. Помогите разобраться.
    Приводиться код на Асме для связе с СИ
    Т.е. процедура написанная на ассемблере должна вызываться из СИ.

    .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

    Спасибо.
     
  2. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    в учебниках это описано. bp использовать не обязательно.
    public - ключевое слово для обозначения видимости функции или переменной.
     
  3. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Привидите пример пожалуйста или дайте соотв. ссылку на ресурс.
    Я читаю секреты прогр. игр -Ламота, 94 года, он там ничего не рассказывает почему именно так. А просто пишет так.
    Где про это почитать? В Assembler Юров тоже ничего нету, чтоб понять эти действия Ламота.
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    NoName
    По-русски это называется "соглашение о связях" ( сексуально звучит сегодня).
    Любой нормальный учебник по Си(не Си за 21 день) содержит инфу об этом и многом другом.
    bp используется для удобства. Если ты в проге меняешь указатель стека, то тебе будет неудобно
    обращаться к переданным параметрам. Про регистр bp тоже в учебниках по Ассамблеру должно быть.
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Параметры, передаваемые в процедуру, передаются через стек (ложатся в стек), а где именно находится вершина стека, указывается в регистре 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).
     
  6. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    NoName
    Последний пост (перед этим) был бы абсолютно точным, если речь шла бы о 32-битном режиме (с заменой bp/sp на ebp/esp), но в 16-битном режиме нужно ещё учитывать, что адресации через sp просто нет (не существует опкода, соответствующего "mov ax,[sp+2]"), так что обращение через bp практически единственно возможное (формально говоря, можно писать также "mov bx/si/di,sp" и обращаться через bx/si/di, но тогда тратится лишний регистр и приходится явно писать префикс переопределения сегмента "ss:" при обращении).

    В учебнике Юрова этому (и смежным вопросам) посвящена целая глава, номер 14. Читай внимательнее.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    diamond
    да и просто сам регистр (e)bp был изначально для этого предназначен. мы гдето уже разбирались в этом в старых темах несколько месяцев назад +)
     
  8. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    [Offtop] А меня радует, что новички такие крутые вопросы задают :) И в праздники жизнь кипит на васме! И не только в праздники!
     
  9. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Чёт не пойму, почему он важен, зачем его предварительно сохранять, или там важная инфа храниться?
    Что может случиться, если это не сделать?
     
  10. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    ajak попробую объяснить
    Код (Text):
    1. main
    2. ...
    3. интенсивно используем регистр bp/ebp
    4. ...
    5. call proc; также интенсивно использует bp/ebp
    6. при выходе из процедуры proc данные в bp/ebp
    7. будут испорчены, если в процедуре не было
    8. стандартного пролога push ebp/mov ebp,esp и
    9. стандартного эпилога pop ebp
     
  11. ajak

    ajak New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2007
    Сообщения:
    463
    Значит опасно :)