Asm & C++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ~EviL~, 21 Nov 2010.

  1. ~EviL~

    ~EviL~ Elder - Старейшина

    Joined:
    14 Aug 2007
    Messages:
    169
    Likes Received:
    77
    Reputations:
    4
    Всем привет :) Такая проблема: не получается "связать" процедуру из ASM с программой на C++. Выкладываю исходники:
    main.asm
    Code:
    TITLE AssemblyTest
    
    INCLUDE Irvine32.inc
    
    _Func PROTO C, sPtr:PTR BYTE
    
    .data
    str1 BYTE ?
    
    .code
    _Func PROC sPtr:PTR BYTE
        mov edx, sPtr
        call WriteString
        
        ret
    _Func ENDP
    END
    
    
    test.cpp
    Code:
    #include <iostream>
    #include "assembly.h"
    #include "main.asm"
    using namespace std;
    
    int main() {
    	string var;
    	string *variable;
    	var = "Hey there!";
    	variable = &var;
    
    	_Func(variable);
    
    	return 0;
    }
    
    
    assembly.h
    Code:
    extern "C" {
    	void _Func(std::string *newStr);
    }
    
    
     
  2. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    809
    Likes Received:
    412
    Reputations:
    62
    че за стреда разработки ?

    в виз студии писал что нить подобное, только асм код был в длл, а прога на С++ его вызывала.
    вот что наскреб по засусекам..

    код проги на С++ который вызывает длл

    длл с асмом

    MYDLL.CPP

    MYDLL.DEF

    смотри мож по аналогии что нить намутишь. просто нет времени конкретно вникать в твою задачу, вот и скинул куски того что когда то писал.
     
    _________________________
  3. ~EviL~

    ~EviL~ Elder - Старейшина

    Joined:
    14 Aug 2007
    Messages:
    169
    Likes Received:
    77
    Reputations:
    4
    Я использую Microsoft Visual Studio 2010. У тебя, по ходу, в MYDLL.CPP так называемый "inline assembly code", а мне нужно, чтобы они были в разных файлах - "external linking"; например: main.cpp и assembler.asm ;)
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Ну дык ты не туда полез.
    ASM файлы ты сам компилишь и получаешь obj файлы, а их уже при линковке используешь.
    т.е. через тотже masm скомпилить этото asm код в obj и добавль в проект (в параметры линкера)
     
    2 people like this.
  5. ~EviL~

    ~EviL~ Elder - Старейшина

    Joined:
    14 Aug 2007
    Messages:
    169
    Likes Received:
    77
    Reputations:
    4
    Получил obj файл, добавил в проект и прописал в include; теперь проект напрочь отказывает компилироваться и выдает множество ошибок:
    Code:
    Error	1	error C2018: unknown character '0x1'
    Error	2	error C2018: unknown character '0x6'
    Error	3	error C2018: unknown character '0x1c'
    Error	4	error C2018: unknown character '0x13'
    Error	5	error C2146: syntax error : missing ';' before identifier 'Ь«йLv'
    Error	6	error C4430: missing type specifier - int assumed. Note: C++ does not support default-int	
    Error	7	error C2143: syntax error : missing ';' before '.'
    ...
    
    test.cpp
    Code:
    #include <iostream>
    #include "assembly.h"
    #include "main.obj"
    using namespace std;
    
    int main() {
    	string var;
    	string *variable;
    	var = "Hey there!";
    	variable = &var;
    
    	_Func(variable);
    
    	return 0;
    }
    
    
    Странно...
     
    #5 ~EviL~, 22 Nov 2010
    Last edited: 22 Nov 2010
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Его иклудить не надо. Его надо добавлять при линковке. Просто тупо в командноую строку линкера добавь этот файл.
     
    #6 slesh, 22 Nov 2010
    Last edited: 22 Nov 2010