Re: Macro To Generate Inline Assembly
On 27 Apr., 15:29, Le Chaud Lapin <jaibudu...@gmail.com> wrote:
Currently, ADD, SUBTRACT, MULTIPLY, AND DIVIDE are written in C++. I
would like to replace the C++ code with inline assembly, using a macro
to generate the inline assembly to facilitate support for as many
CPU's as possible [Yes, I know some compilers do not support inline
assembly for some CPU's].
I tried:
#define MULTIPLY(A, B, lower_word, upper_word)\
{\
_asm mov eax, A;\
_asm mul B;\
1) IMO the x86 processor does not accept a literal
as argument of mul (B == 0). Only registers or
variables are allowed.
2) MS does not officially support _asm, it seems
to be a relict, which just may work. You will find
out that it does *not* work, if you disable language
extensions (/Za). I recommend to use the officially
supported __asm (double underscore) notation.
_asm mov upper_word, edx;\
_asm mov lower_word, eax;\
}
int foo ()
{
unsigned int L, H;
MULTIPLY(0, 0, L, H);
return 0;
}
..and I get the following error:
1>Compiling...
1>Integer.cpp
1>..\Integer\Integer.cpp(44) : error C2447: '{' : missing function
header (old-style formal list?)
1>..\Integer\Integer.cpp(65) : error C2017: illegal escape sequence
..using Visual Studio 2005.
There seems to be some kind of strange interaction between the
preprocessor and the inline-assembly lexical analyzer.
Naturally, I would like to understand not just how to do this for
VS2005, but for all systems/compilers, so that I am not left guessing
whether I got it right or not.
Unfortunately this seems an impossible task, because
no compiler I'm aware of uses the standardized syntax
for assembler declaration, which would change your code to
#define MULTIPLY(A, B, lower_word, upper_word)\
{\
asm("mov eax, A");\
asm("mul B");\
asm("mov upper_word, edx");\
asm("mov lower_word, eax");\
}
Back to your compiler/pre-processor problem: It seems
that you can solve your problem in this case by
removing the final semicola (according to the MS
documentation this is feasible). My recommended
syntax would be to write the code as follows (note
that I use __asm instead of _asm):
#define MULTIPLY(A, B, lower_word, upper_word)\
{\
__asm mov eax, A\
__asm mul B\
__asm mov upper_word, edx\
__asm mov lower_word, eax\
}
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]