No mixin inside asm blocks
Ali Çehreli
acehreli at yahoo.com
Wed Jan 30 11:39:28 PST 2013
On 01/30/2013 11:08 AM, Philippe Sigaud wrote:
> On Wed, Jan 30, 2013 at 4:01 PM, Ali Çehreli<acehreli at yahoo.com> wrote:
>> A friend of mine is trying to figure out the D equivalent of using
macros
>> with asm blocks in C:
>>
>> #define NEXT() __asm__("jmp *%0"::"r"((++ip)->jmp)); goto *ip->jmp
>>
>> D's asm blocks are very restrictive: mixins are not allowed. What do
you do
>> in D?
>
> Is it possible to enclose an asm statement into a mixin?
>
> mixin("
> asm {
>
> ....
>
> code to include
>
> }");
Thanks!
It is almost there, except that one needs to use a compile-time "macro
expansion" solution, which I am too lazy to try now. :) I am confident
that the following program will work after doing that. (Of course also
after replacing 'writeln' with 'mixin'.)
import std.stdio;
import std.regex;
string expandNexts(string input)
{
enum e = ctRegex!("Next;", "g");
// NOTE: This is an example. Of course, the second string below
should be
// whatever the "macro" should be expanded as.
return replace(input, e, "cmp EAX,0;");
}
void main()
{
writeln (expandNexts(q{
asm
{
mov EAX, 10000;
Next;
Next;
Next;
Next;
Next;
}
}));
}
The program prints
asm
{
mov EAX, 10000;
cmp EAX,0;
cmp EAX,0;
cmp EAX,0;
cmp EAX,0;
cmp EAX,0;
}
Ali
More information about the Digitalmars-d-learn
mailing list