VC++ 64 Bit: Wie ASM-Code einbinden?
-
Wie binde ich unter VC++ 2010 64 Bit Assembler-Code ein?
-
*.asm und ml64
-
Was denn, ist das in der VC++ Hilfe für 64bit nicht gut genug beschrieben?
(ich habs mir noch nicht angeguckt)(wieso auch 64bit=>lieber Linux nehmen, aber egal) (Die Asm-Einbindung ist doch für den VC++ 2008 auch sehr gut beschrieben, hat sich das beim Wechsel auf 64bit geändert?)(oh, voreilig gewesen: http://www.c-plusplus.net/forum/viewtopic-var-t-is-271889-and-sid-is-582ef758cc07625a66fe0c8ad578ccd5.html)
-
Wenn meine Funktion vom Typ
unsigned long long __fastcall foo(unsigned long long, unsigned long long, unsigned long long, unsigned long long&)
ist, wie sage ich das ml64?
-
sddsfdfs schrieb:
Wenn meine Funktion vom Typ
unsigned long long __fastcall foo(unsigned long long, unsigned long long, unsigned long long, unsigned long long&)
ist, wie sage ich das ml64?
Dem Assembler musst Du nichts sagen. Du programmierst in Assembler einfach los, implementierst __fastcall und dann irgendwo in einer Header-Datei sagst Du einfach:
extern unsigned long long __fastcall foo(unsigned long long, unsigned long long, unsigned long long, unsigned long long&)
Also extern nicht vergessen...
-
Ach ja und Semikolon nicht vergessen:
extern unsigned long long __fastcall foo(unsigned long long, unsigned long long, unsigned long long, unsigned long long&);
-
Siehe dazu auch hier: http://msdn.microsoft.com/en-us/library/ms235286(VS.80).aspx
-
Ich bekomme folgenden Fehler:
error LNK2019: unresolved external symbol "unsigned __int64 __cdecl divideASM(unsigned __int64,unsigned __int64,unsigned __int64,unsigned __int64 &)" (?divideASM@@YA_K_K00AEA_K@Z) referenced in function
obwohl ich __fastcal angegeben habe:
extern unsigned long long __fastcall divideASM(unsigned long long a_low, unsigned long long a_high, unsigned long long b, unsigned long long& r);
und das ist mein .asm-File:
divideASM PROTO .code PUBLIC divideASM _TEXT SEGMENT divideASM PROC mov rax, rcx div r8 ; dividiere rdx:rax durch r8 mov QWORD PTR [r9], rdx ; speichere Rest in r ret 0 divideASM ENDP _TEXT ENDS end
-
Vielleicht musst Du im Assembler-Quellcode statt divideASM mit _divideASM arbeiten
-
Vor allem musst du die Funktion in C++ als extern "C" deklarieren damit der Compiler kein Name Mangling macht.
-
dot schrieb:
Vor allem musst du die Funktion in C++ als extern "C" deklarieren damit der Compiler kein Name Mangling macht.