On 27 Apr., 15:29, Le Chaud Lapin <jaibudu...@[EMAIL PROTECTED]
> 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 sup****t for as many
> CPU's as possible [Yes, I know some compilers do not sup****t 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 sup****t _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
sup****ted __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
do***entation 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! ]


|