Thread overview
Compatibility with other C++ dev systems
Jun 07, 2001
John Kohr
Jun 09, 2001
Walter
Jun 12, 2001
John Kohr
Jun 12, 2001
Walter
June 07, 2001
Since I just discovered that Digital Mars compiler existed (I thought Symantec killed the C++ project after version 7.5) I would like to say a big thanks to Walter for putting time and effort to update this wonderful tool!

Could you please fix the following inline assembler bug to make it more compatible with MASM, TASM, CodeWarrior and other assemblers and C/C++ compilers:

The following statement is legal with most other dev systems:

dd    offset any_variable_or_label

where any_variable_or_label is, of course, any variable or label. Digitalmars chokes with the error "expression expected".

This is actually really very simple and should not take more than a few minutes to fix, having the source code. If you are wondering what the assembled 4 bytes should look like, consider the following statement:

mov    eax, offset any_variable_or_label

which assembles as:

B8 xx xx xx xx

where xx xx xx xx represents the linker relocatable address of the variable or label. So just take out the B8 and you get what the assembled 4 bytes should be.

The DD statement used this way works with all other systems I tried and has many important uses, most notably in optimizing C/C++ switch statements. As a matter of fact, many C/C++ compilers use the technique extensively.

Thanks,

John

June 09, 2001
That is a great suggestion. -Walter

John Kohr wrote in message <3B1FFA4B.C8E2BB8E@home.com>...
>Since I just discovered that Digital Mars compiler existed (I thought Symantec killed the C++ project after version 7.5) I would like to say a big thanks to Walter for putting time and effort to update this wonderful tool!
>
>Could you please fix the following inline assembler bug to make it more compatible with MASM, TASM, CodeWarrior and other assemblers and C/C++ compilers:
>
>The following statement is legal with most other dev systems:
>
>dd    offset any_variable_or_label
>
>where any_variable_or_label is, of course, any variable or label. Digitalmars chokes with the error "expression expected".
>
>This is actually really very simple and should not take more than a few minutes to fix, having the source code. If you are wondering what the assembled 4 bytes should look like, consider the following statement:
>
>mov    eax, offset any_variable_or_label
>
>which assembles as:
>
>B8 xx xx xx xx
>
>where xx xx xx xx represents the linker relocatable address of the variable or label. So just take out the B8 and you get what the assembled 4 bytes should be.
>
>The DD statement used this way works with all other systems I tried and has many important uses, most notably in optimizing C/C++ switch statements. As a matter of fact, many C/C++ compilers use the technique extensively.
>
>Thanks,
>
>John
>


June 12, 2001
It seems that you thought of this yourself long ago since I discovered the undocumented/half-implemented DA assembler directive early on in the 8.x compiler series.

I assume it means Define Address and will work eventually just like what I suggested for DB, DW, DD, DQ, DT in my post except that it won't need the OFFSET keyword. That could save some typing and would even be portable across various compilers which do not support it with the following simple #define:

#define DA     DD offset

But maybe you meant it for something else, like Difference of Address between 2 code labels. That would also make sense since the difference of any two relocatable addressess in the same executable is actually a constant integer, independent of where in memory the operating system loads the file and independent of any relocations that are thus applied!


Keep up the good work!

Thanks,

John

PS: Questions of the curious:

Q1: Why does the _TEXT section emitted by DigitalMars compiler start with 16 unused zero bytes?

Q2: Is there a structure to the .CRT$XIA section or is it unstructured?


Walter wrote:

> That is a great suggestion. -Walter
>
> John Kohr wrote in message <3B1FFA4B.C8E2BB8E@home.com>...
> >Since I just discovered that Digital Mars compiler existed (I thought Symantec killed the C++ project after version 7.5) I would like to say a big thanks to Walter for putting time and effort to update this wonderful tool!
> >
> >Could you please fix the following inline assembler bug to make it more compatible with MASM, TASM, CodeWarrior and other assemblers and C/C++ compilers:
> >
> >The following statement is legal with most other dev systems:
> >
> >dd    offset any_variable_or_label
> >
> >where any_variable_or_label is, of course, any variable or label. Digitalmars chokes with the error "expression expected".
> >
> >This is actually really very simple and should not take more than a few minutes to fix, having the source code. If you are wondering what the assembled 4 bytes should look like, consider the following statement:
> >
> >mov    eax, offset any_variable_or_label
> >
> >which assembles as:
> >
> >B8 xx xx xx xx
> >
> >where xx xx xx xx represents the linker relocatable address of the variable or label. So just take out the B8 and you get what the assembled 4 bytes should be.
> >
> >The DD statement used this way works with all other systems I tried and has many important uses, most notably in optimizing C/C++ switch statements. As a matter of fact, many C/C++ compilers use the technique extensively.
> >
> >Thanks,
> >
> >John
> >

June 12, 2001
DA is supposed to be "Define Address" and be usable for labels and such. It isn't documented because, as you say, it is only half implemented. I need to get it fixed.

The 16 bytes of 0 is one of the Great DOS Mysteries, as in I could never figure out why Microsoft DOS required it to be there. So the linker always adds it.

.CRT$XIA is in \dm\src\core32\cinit.asm, and is simply a null terminated array of function pointers to static constructors that gets called by the startup code.


John Kohr wrote in message <3B25711F.3C6B1EEF@home.com>...
>It seems that you thought of this yourself long ago since I discovered the undocumented/half-implemented DA assembler directive early on in the 8.x compiler series.
>
>I assume it means Define Address and will work eventually just like what I suggested for DB, DW, DD, DQ, DT in my post except that it won't need the OFFSET keyword. That could save some typing and would even be portable across various compilers which do not support it with the following simple #define:
>
>#define DA     DD offset
>
>But maybe you meant it for something else, like Difference of Address between 2 code labels. That would also make sense since the difference of any two relocatable addressess in the same executable is actually a
constant
>integer, independent of where in memory the operating system loads the file and independent of any relocations that are thus applied!
>
>
>Keep up the good work!
>
>Thanks,
>
>John
>
>PS: Questions of the curious:
>
>Q1: Why does the _TEXT section emitted by DigitalMars compiler start with
16
>unused zero bytes?
>
>Q2: Is there a structure to the .CRT$XIA section or is it unstructured?
>
>
>Walter wrote:
>
>> That is a great suggestion. -Walter
>>
>> John Kohr wrote in message <3B1FFA4B.C8E2BB8E@home.com>...
>> >Since I just discovered that Digital Mars compiler existed (I thought Symantec killed the C++ project after version 7.5) I would like to say a big thanks to Walter for putting time and effort to update this wonderful tool!
>> >
>> >Could you please fix the following inline assembler bug to make it more compatible with MASM, TASM, CodeWarrior and other assemblers and C/C++ compilers:
>> >
>> >The following statement is legal with most other dev systems:
>> >
>> >dd    offset any_variable_or_label
>> >
>> >where any_variable_or_label is, of course, any variable or label. Digitalmars chokes with the error "expression expected".
>> >
>> >This is actually really very simple and should not take more than a few minutes to fix, having the source code. If you are wondering what the assembled 4 bytes should look like, consider the following statement:
>> >
>> >mov    eax, offset any_variable_or_label
>> >
>> >which assembles as:
>> >
>> >B8 xx xx xx xx
>> >
>> >where xx xx xx xx represents the linker relocatable address of the variable or label. So just take out the B8 and you get what the assembled 4 bytes should be.
>> >
>> >The DD statement used this way works with all other systems I tried and has many important uses, most notably in optimizing C/C++ switch statements. As a matter of fact, many C/C++ compilers use the technique extensively.
>> >
>> >Thanks,
>> >
>> >John
>> >
>