Добрый вечер! У меня возникла проблемма. Я пишу программу. Большая часть программы написана на ассемблере. Остальную часть программы ( несколько функций ) я могу реализовать только на C++ ( т.к. не могу на ассемблере ). Вопрос: 1) Возможно ли обьединить в единое целое ( часть программы написаную на ассемблере и часть программы на C++ )( основная часть программы написана на MASM, а остальная часть на C++ - она как бы вставка в программу на ассемблере ). Возможно я не прав, но я думаю что эту задачу можно решить путем создания .obj файла на MASM и .obj файла на Visual Studio C++. И затем слинковать эти оба файла. Если это возможно. Подскажите пожалуйста как мне поступить в этой ситуации. Как обединить код на MASM и C++. Заранее благодарен.
asmic Возможно я не прав, но я думаю что эту задачу можно решить путем создания .obj файла на MASM и .obj файла на Visual Studio C++. И затем слинковать эти оба файла. Абсолютно прав. Единственно в экcпортируемых функциях надо ставить "extern C". Ну и конвенцию одинаковую использовать (stcall или cdecl).
Всем добрый день! Вчера весь вечер и всю ночь потратил на то чтобы слинковать два .obj файла. Но у меня ничего не получалось. Я прошу обьясите на наглядном примере, как прикрутить C++ код к MASM коду. Кто знает как сделать, выложите пожалуйста исходники ( например: простое приложение на MASM вызывающее функцию написаную на C++, и сам код на C++ с вызываемой функцией ). Буду очень благодарен. Я с этой проблеммой столкнулся первый раз. Очень трудно решить её без наглядного примера. Напишите как слинковать два .obj файла ( опции линкера ). т.к. я этого никогда не делал. Заранее благодарен.
Booster спасибо. Старик, если не трудно напиши наглядный пример ( простое приложение на masm, которое вызывает функцию на C++ например MessageBox, и код на C++ с функцией ). И строку для линкера ( чтобы слинковать это дело ). А то я вобще запутался вчера с этими ( "extern C" и т.д. и т.п. ). Как увиже пример, сразу все станет ясно Заранее благодарен.
Да напишите кто нить наглядный простенький примерчик, мне то это необходимо, не раз сталкивался с подобной проблемой, и всегда оставлял на потом.
искать не пробовали? у меня вот есть единственная бумажная книга по ассемблеру Юрова, там всё чётко написано, кроме этого можно посмотреть сюда также ностоятельно рекомендуется прочитать в мсдн раздел calling convetions. Но боюсь вы это уже пробовали и у вас не получилось, ну что ж пример так пример (на продуктах М$) начнём с программы С(test.c): Код (Text): #include <windows.h> #pragma comment (linker, "/nodefaultlib") extern DWORD __stdcall asm_func(DWORD param); void mymain() { DWORD dw = 1; char str[256]; dw = asm_func(dw); wsprintf(str, "%d", dw); MessageBox(0, str, 0, 0); } код на MASM(asmtest.asm): Код (Text): .386 .model flat, stdcall public asm_func .code asm_func proc param:DWORD mov eax, param sub eax, 2 ret asm_func endp end asm_func теперь всё это дело нужно скомпилировать и скомпоновать вместе, делается это так: Код (Text): D:\temp\asmic>ml /c asmtest.asm Microsoft (R) Macro Assembler Version 8.00.50727.42 Copyright (C) Microsoft Corporation. All rights reserved. Assembling: asmtest.asm D:\temp\asmic>cl /GS- /c test.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. test.c D:\temp\asmic>link /subsystem:windows /entry:mymain test asmtest user32.lib Microsoft (R) Incremental Linker Version 8.00.50727.42 Copyright (C) Microsoft Corporation. All rights reserved. D:\temp\asmic> на выходе получаем test.exe запустив который видим мессаджбокс с надписью "-1" , -1 потому что проинициализировали перемунную dw единицей, а в процедуре асма отняли от неё 2 удачи
Да, rain молодец, подсказал как написать программу на C++ вызывающую функцию на MASM. Но очень бы хотелось увидеть пример программы на MASM вызывающую функцию на C++. Если у кого есть наглядный пример. То выложите пожалуйста. Заранее благодарен.
asmic Я правда не уверен что смогу приаттачить, но попробую. Кстати я был вроде не прав, объектники перечисляются через пробел. Толи справка у меня не та, толи ещё что.
ребята в чём разница, ну раз вы так хотите хорошо задача меняется с точностью до наоборот теперь все что было в асм будет в С а что было в С теперь будет в асме Поехали. Чтобы сильно не мудохаться объявим в асме екстерн как EXTERN c_proc@4: PROC итак асм (asmtest.asm): Код (Text): .386 .model flat, stdcall include user32.inc includelib user32.lib include Strings.mac EXTERN c_proc@4: PROC .data? _str db 256 dup(?) .code start: mov eax, 1 push eax call c_proc@4 invoke wsprintf, offset _str, $CTA("%d"), eax invoke MessageBox, 0, offset _str, 0, 0 ret end start C код(test.c) Код (Text): #include <windows.h> DWORD __stdcall c_proc(DWORD param) { return param-2; } копмилим: Код (Text): D:\temp\asmic>ml /c /I"c:\masm32\include" asmtest.asm Microsoft (R) Macro Assembler Version 8.00.50727.42 Copyright (C) Microsoft Corporation. All rights reserved. Assembling: asmtest.asm D:\temp\asmic>cl /c test.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. test.c D:\temp\asmic>link /subsystem:windows /entry:start test asmtest user32.lib Microsoft (R) Incremental Linker Version 8.00.50727.42 Copyright (C) Microsoft Corporation. All rights reserved. D:\temp\asmic> вопросы?