Как обьединить код на MASM и C++.

Тема в разделе "WASM.BEGINNERS", создана пользователем asmic, 13 авг 2007.

  1. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Добрый вечер! У меня возникла проблемма. Я пишу программу. Большая часть программы написана на ассемблере. Остальную часть программы ( несколько функций ) я могу реализовать только на C++ ( т.к. не могу на ассемблере ). Вопрос:
    1) Возможно ли обьединить в единое целое ( часть программы написаную на ассемблере и часть программы на C++ )( основная часть программы написана на MASM, а остальная часть на C++ - она как бы вставка в программу на ассемблере:) ).
    Возможно я не прав, но я думаю что эту задачу можно решить путем создания .obj файла на MASM и .obj файла на Visual Studio C++. И затем слинковать эти оба файла. Если это возможно. Подскажите пожалуйста как мне поступить в этой ситуации. Как обединить код на MASM и C++. Заранее благодарен.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    asmic
    Возможно я не прав, но я думаю что эту задачу можно решить путем создания .obj файла на MASM и .obj файла на Visual Studio C++. И затем слинковать эти оба файла.

    Абсолютно прав. Единственно в экcпортируемых функциях надо ставить "extern C". Ну и конвенцию одинаковую использовать (stcall или cdecl).
     
  3. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Всем добрый день! Вчера весь вечер и всю ночь потратил на то чтобы слинковать два .obj файла. Но у меня ничего не получалось. Я прошу обьясите на наглядном примере, как прикрутить C++ код к MASM коду. Кто знает как сделать, выложите пожалуйста исходники ( например: простое приложение на MASM вызывающее функцию написаную на C++, и сам код на C++ с вызываемой функцией ). Буду очень благодарен. Я с этой проблеммой столкнулся первый раз. Очень трудно решить её без наглядного примера. Напишите как слинковать два .obj файла ( опции линкера ). т.к. я этого никогда не делал. Заранее благодарен.
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    asmic
    Вот с этого и надо было начинать -)

     
  5. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Booster спасибо. Старик, если не трудно напиши наглядный пример ( простое приложение на masm, которое вызывает функцию на C++ например MessageBox, и код на C++ с функцией ). И строку для линкера ( чтобы слинковать это дело ). А то я вобще запутался вчера с этими ( "extern C" и т.д. и т.п. ;) ). Как увиже пример, сразу все станет ясно;) Заранее благодарен.
     
  6. ring4

    ring4 New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2006
    Сообщения:
    279
    Да напишите кто нить наглядный простенький примерчик, мне то это необходимо, не раз сталкивался с подобной проблемой, и всегда оставлял на потом.
     
  7. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    искать не пробовали? у меня вот есть единственная бумажная книга по ассемблеру Юрова, там всё чётко написано, кроме этого можно посмотреть сюда также ностоятельно рекомендуется прочитать в мсдн раздел calling convetions. Но боюсь вы это уже пробовали и у вас не получилось, ну что ж пример так пример (на продуктах М$)
    начнём с программы С(test.c):
    Код (Text):
    1. #include <windows.h>   
    2.  
    3. #pragma comment (linker, "/nodefaultlib")
    4.  
    5. extern DWORD __stdcall  asm_func(DWORD param);
    6.  
    7. void mymain()
    8. {
    9.     DWORD dw = 1;
    10.     char str[256];
    11.    
    12.     dw = asm_func(dw);
    13.    
    14.     wsprintf(str, "%d", dw);
    15.     MessageBox(0, str, 0, 0);
    16. }
    код на MASM(asmtest.asm):
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3.  
    4. public asm_func
    5.  
    6. .code
    7.  
    8. asm_func  proc param:DWORD
    9.  
    10.     mov eax, param
    11.     sub eax, 2
    12.     ret
    13. asm_func endp
    14. end asm_func
    теперь всё это дело нужно скомпилировать и скомпоновать вместе, делается это так:
    Код (Text):
    1. D:\temp\asmic>ml /c asmtest.asm
    2. Microsoft (R) Macro Assembler Version 8.00.50727.42
    3. Copyright (C) Microsoft Corporation.  All rights reserved.
    4.  
    5.  Assembling: asmtest.asm
    6.  
    7. D:\temp\asmic>cl /GS- /c test.c
    8. Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
    9. Copyright (C) Microsoft Corporation.  All rights reserved.
    10.  
    11. test.c
    12.  
    13. D:\temp\asmic>link /subsystem:windows /entry:mymain test asmtest user32.lib
    14. Microsoft (R) Incremental Linker Version 8.00.50727.42
    15. Copyright (C) Microsoft Corporation.  All rights reserved.
    16.  
    17.  
    18. D:\temp\asmic>
    на выходе получаем test.exe запустив который видим мессаджбокс с надписью "-1" , -1 потому что проинициализировали перемунную dw единицей, а в процедуре асма отняли от неё 2
    удачи :derisive:
     
  8. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    rain огромное спасибо!!!!!
     
  9. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Да, rain молодец, подсказал как написать программу на C++ вызывающую функцию на MASM. Но очень бы хотелось увидеть пример программы на MASM вызывающую функцию на C++. Если у кого есть наглядный пример. То выложите пожалуйста. Заранее благодарен.
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    asmic

    Я правда не уверен что смогу приаттачить, но попробую.

    Кстати я был вроде не прав, объектники перечисляются через пробел. Толи справка у меня не та, толи ещё что.
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    asmic
    Да, и не забудь обязательно прочитать ReadMe.
     
  12. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    ребята в чём разница, ну раз вы так хотите хорошо
    задача меняется с точностью до наоборот теперь все что было в асм будет в С а что было в С теперь будет в асме
    Поехали. Чтобы сильно не мудохаться объявим в асме екстерн как EXTERN c_proc@4: PROC
    итак асм (asmtest.asm):
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3.  
    4. include user32.inc
    5. includelib user32.lib
    6.  
    7. include Strings.mac
    8.  
    9. EXTERN c_proc@4: PROC
    10.  
    11. .data?
    12.     _str db 256 dup(?)
    13.  
    14. .code
    15.    
    16. start:
    17.    
    18.     mov eax, 1
    19.     push eax
    20.     call c_proc@4
    21.    
    22.     invoke wsprintf, offset _str, $CTA("%d"), eax  
    23.     invoke MessageBox, 0, offset _str, 0, 0
    24.    
    25.     ret
    26. end start
    C код(test.c)
    Код (Text):
    1. #include <windows.h>
    2.    
    3.  
    4. DWORD __stdcall c_proc(DWORD param)
    5. {
    6.     return param-2;
    7. }
    копмилим:
    Код (Text):
    1. D:\temp\asmic>ml /c /I"c:\masm32\include" asmtest.asm
    2. Microsoft (R) Macro Assembler Version 8.00.50727.42
    3. Copyright (C) Microsoft Corporation.  All rights reserved.
    4.  
    5.  Assembling: asmtest.asm
    6.  
    7. D:\temp\asmic>cl /c test.c
    8. Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
    9. Copyright (C) Microsoft Corporation.  All rights reserved.
    10.  
    11. test.c
    12.  
    13. D:\temp\asmic>link /subsystem:windows /entry:start test asmtest user32.lib
    14. Microsoft (R) Incremental Linker Version 8.00.50727.42
    15. Copyright (C) Microsoft Corporation.  All rights reserved.
    16.  
    17.  
    18. D:\temp\asmic>
    вопросы?
     
  13. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Всем огромное спасибо за помощь!!! Буду разбираться;)