This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

ARM Vs GCC assembler

Note: This was originally posted on 25th January 2013 at http://forums.arm.com

Hi,

I have a question regarding the ARM and GCC assemblers i.e. ARMASM and GAS.

MOV.W R4,#0x87C0 is translated to F248_74C0 by ARMASM.

However, GAS throws up the error "invalid constant (87c0) after fixup" for the same instruction. Why does GAS give an error for this?

I realise the operand is 16-bit but I'm using the '.syntax unified'. I thought GAS supports .W and .N suffixes. Even without the .W suffix, GAS gives the same error whereas ARMASM quietly expands the 16-bit instruction to 32-bit.

I'm using 'GCC version 4.7.2 (Sourcety CodeBench Lite 2012.09-63).

Any insight as to why GAS is giving an error is appreciated. The workaround is to use two instructions. The following 2 instructions compile OK.

MOVW  R4  ,#0xC0
MOVT R4  ,#0x87

Thanks and regards,
Ger
Parents
  • Note: This was originally posted on 4th February 2013 at http://forums.arm.com

    0x87C isn't a valid 12-bit Thumb-2 immediate either. The encoding is more complex than just loading the bottom 12 bits. It's described in section A6.3.2 in the ARM v7a architecture reference manual (document DDI0406B). In a nutshell, it can be represented if the least to most significant bits span no more than 8 bit positions (your example spans 10) or if there are 8-bits repeated over 32-bits in a pattern of 0X0X, X0X0, or XXXX.

    If you need UAL code that assembles as both Thumb-2 and ARM the allowed immediates will be a little more limited.
Reply
  • Note: This was originally posted on 4th February 2013 at http://forums.arm.com

    0x87C isn't a valid 12-bit Thumb-2 immediate either. The encoding is more complex than just loading the bottom 12 bits. It's described in section A6.3.2 in the ARM v7a architecture reference manual (document DDI0406B). In a nutshell, it can be represented if the least to most significant bits span no more than 8 bit positions (your example spans 10) or if there are 8-bits repeated over 32-bits in a pattern of 0X0X, X0X0, or XXXX.

    If you need UAL code that assembles as both Thumb-2 and ARM the allowed immediates will be a little more limited.
Children
No data