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 1st February 2013 at http://forums.arm.com

    I think what's going on here is confusion between the "W" in "MOVW" and ".W".

    ".W" means use a wide (32-bit) encoding for this instruction even if a 16-bit encoding exists.

    "MOVW" as a Thumb instruction is only available as a wide (.W) instruction, after all it needs room for a 16-bit immediate value; so "MOVW" and "MOVW.W" are the same thing.

    Apparently armasm is willing to translate "MOV rn,#imm" to "MOVW rn,#imm" if the immediate value requires it and the gas you are using is not willing.
Reply
  • Note: This was originally posted on 1st February 2013 at http://forums.arm.com

    I think what's going on here is confusion between the "W" in "MOVW" and ".W".

    ".W" means use a wide (32-bit) encoding for this instruction even if a 16-bit encoding exists.

    "MOVW" as a Thumb instruction is only available as a wide (.W) instruction, after all it needs room for a 16-bit immediate value; so "MOVW" and "MOVW.W" are the same thing.

    Apparently armasm is willing to translate "MOV rn,#imm" to "MOVW rn,#imm" if the immediate value requires it and the gas you are using is not willing.
Children
No data