Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Взаимодействие С++ и Asma  (Прочитано 8184 раз)
0 Пользователей и 1 Гость смотрят эту тему.
scraper
Гость
« : 10-06-2006 21:11 » 

Как происходит взаимодействие в исходнике написаном на С++, с ассемблерными вставками, между С++ и Ассемблером?
То есть, то что асм делает, как С++ принимает и обрабатывает, и дальше посылает?
И наоборот?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 10-06-2006 21:46 » new

 Отлично Отличный арабский!

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

Обратно - то же самое, но в асме ничего объявлять не требуется, а в С только не заявляй ф-ию статик.
« Последнее редактирование: 10-06-2006 21:48 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
scraper
Гость
« Ответ #2 : 11-06-2006 19:43 » 

RXL, Cпасибо, только вопросы буквально к каждому слову.  Жаль
Создаю асмовскую процедуру в С++ проге.
                                                                   Где заявлять, что соглашение по передаче параметров - stdcall?
                                                                   Документация по асму, в чем она представлена, как ее найти, где смотреть?
                                                                   Как в Borland C++ Builder 6.0 или Visual C++ откомпить прогу до объектного файла?
                                                                   Что значит прототип процедуры, как объявить (если можно, пример, маленький),
                                                                                    компить до объектного файла, как?
                                                                    Линкую в самой среде?
Извините, что так дотошно.  Жаль
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 11-06-2006 20:16 » 

scraper, Если ты в самой С++ программе вставляеш ассемблерный код, то то что сказал RXL тебя не волнует. Так как согласование всех вызовов уже берет на себя сам компилятор и линковшик.
_stdcall это один из стандартов вызова функций. Этот стандарт говорит о том, как располагать параметры вызова функции. В данном стандарте все параметры распологаются в стэке. Справа на лево насколько я помню. Данный стандарт считается основным при построении Dll библиотек. Хотя есть библиотеки (также и стандартные) используюшие другие стандарты. Пример как нужно сказать компилятору, что ты хочеш применить данный стандарт
Код:
bool __stdcall MyFunc(int param1, int param2)
{
    return true;
}

Документацию по ассемблеру. Это любой толковый учебник. Я в свое время прочитал до дыр Питер Абель "Ассемблер для IBM PC". Сейчас, думаю данная книга уже чуть потеряла актуальность. Хотя в свое время была библией дзенствуюших.

Объявлять прототип. Это говорить компилятору, что такая функция сушествует и имеет такие параметры вызова. Компилятор собирает объектныее файл. И указывает, что в коде применяется данная функция. Затем, когда линковшик уже собирает окончательный файл. Он связывает уже линк на другие объектные файлы. Если связь не находится, линковшик дает ошибку построения проекта.
Чтобы указать прототип функции
Код:
bool __stdcall MyFunc(int param1, int param2);
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
scraper
Гость
« Ответ #4 : 11-06-2006 20:39 » 

Ребята, извините, я не понимаю  Жаль
есть асмовский код:     asm
                                 {
                                  mov ah, 5
                                  add ah, 10
                                 }
                                 cout<<................;

теперь в ah хранится 15.

КАК ПЕРЕДАТЬ ЭТО ЗНАЧЕНИЕ (15) В ПРОГУ НА С++???

чтобы вывести это значение в консоль подобным образом: cout<< 'сдесь что-то что содержит в себе 15'
« Последнее редактирование: 19-12-2007 19:28 от Алексей1153++ » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 11-06-2006 20:50 » 

Код:
char i=0;
__asm
{
mov ah, 5
add ah, 10
mov i, ah
};
printf("Zdes chto to soderzit %d \n", i);
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
scraper
Гость
« Ответ #6 : 11-06-2006 21:02 » 

Finch, дружище, спасибо.
Вот так это у меня компилируется:
Код:
#include<iostream.h>

int main()
{
char i=0;
__asm
{
mov ah, 5
add ah, 10
mov i, ah
};

cout<<(int)i<<endl;

return 0;
}
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines