Array indexing/offset inline asm ambiguity

Tobias Pankrath tobias at pankrath.net
Sun Mar 17 02:23:21 PDT 2013


On Sunday, 17 March 2013 at 00:24:16 UTC, David Nadlinger wrote:
> Hi all,
>
> Another installment in the »What does the following function 
> return« series:
>
> ---
> int[2] foo() {
>   int[2] regs;
>   asm {
>     mov regs[1], 0xdeadbeef;
>   }
>   return regs;
> }
> ---
>
> If you answered [0, 0xdeadbeef], then congratulations: You fell 
> into exactly the same trap as Martin Nowak and I did in 
> https://github.com/D-Programming-Language/druntime/pull/426, 
> without any of the other reviewers noticing either.
>
> The issue is that in an inline asm block, regs[1] is actually 
> equivalent to 1[regs] or [regs + 1] and evaluates to an address 
> one *byte* after the start of regs, not one element as it does 
> everywhere else.
>
> In my opinion, this is completely counterintuitive and a source 
> of bugs that could easily be prevented by the language. But 
> Walter seems to think this issue not worth addressing: 
> http://d.puremagic.com/issues/show_bug.cgi?id=9738
>
> What do you think?
>
> Thanks,
> David

I am not using assembler, but I agree with Walter that 
consistency matters.
However if both of you and no reviewer found that bug than maybe 
a warning should be issued if your index in assembler does not 
correspond to the first byte of an element.


More information about the Digitalmars-d mailing list