On Wed, Jan 17, 2024 at 9:34 PM LIU Hao <lh_mo...@126.com> wrote:
>
> Hello,
>
> There hasn't been an solution to https://gcc.gnu.org/PR53929 since almost a 
> dozen years ago, mostly
> due to compatibility with MASM. I was told that the ambiguity of Intel syntax 
> should be classified
> as its own limitation and disrecommendation.
>
> Notwithstanding, I am proposing a permanent solution to this issue, by 
> banning constructions that
> cause ambiguity. This is likely to effect incompatibility with other 
> assemblers, but it should make
> GAS parse the output of GCC flawlessly.
>
>
> PR53929 contains a known ambiguous construction
>
>     lea rax, bx[rip]
>
> where `bx` could denote the BX register and causes confusion. The Intel 
> Software Developer Manual
> also contains an ambiguous construction
>
>     MOV EBX, RAM_START
>
> which would look like loading the offset of `RAM_START`. My proposal is that 
> these two constructions
> are ambiguous and should be rejected. The compiler should generate assembly 
> in the unambiguous
> subset, and we can start to implement the assembler to reject the ambiguous 
> ones.
>
> Their are formalized as
>
>     lea rax, BYTE PTR bx[rip]
>     mov EBX, DWORD PTR RAM_START
>
> Roughly speaking, anything after `PTR`/`BCST` (and before `[` if any) is 
> considered a symbol even if
> it matches a keyword; any identifier between `[` and `]` is a register and 
> not a symbol.
>
>
> My complete proposal can be found at
> <https://github.com/lhmouse/mcfgthread/wiki/Formalized-Intel-Syntax-for-x86>. 
> Some ideas actually
> reflect the AT&T syntax. I hope it helps.

Thanks for the proposal. I hope that -masm=intel becomes more useful:)

Do you have a list of assembly in the unambiguous cases that fail to
be parsed today as a gas PR?
For example,

% as -msyntax=intel -mnaked-reg <<< 'lea rax, BYTE PTR bxx[rip]' -o
a.o && objdump -d -M intel a.o | grep -A1 '>:'
0000000000000000 <.text>:
   0:   48 8d 05 00 00 00 00    lea    rax,[rip+0x0]        # 0x7
% as -msyntax=intel -mnaked-reg <<< 'lea rax, BYTE PTR bx[rip]' -o a.o
&& objdump -d -M intel a.o | grep -A1 '>:'
{standard input}: Assembler messages:
{standard input}:1: Error: invalid use of register
% as -msyntax=intel -mnaked-reg <<< 'mov EBX, DWORD PTR ebx' -o a.o
{standard input}: Assembler messages:
{standard input}:1: Error: invalid use of register

Reply via email to