'x86-64 assembly (AT&T): movq with 32-bit literal into memory [duplicate]

For an assignment, I have the following code:

.global _start

.section .data
arr: .short 1, 2, 3, 4, 5
b: .quad 0x1234567890123456

.section .text
_start:
    movq $arr, b    

We are to assume that the address of the arr label is 0xDEADBEEF, and decide if the command is legal.

Looking through the Intel manual, I found that movq takes a 32-bit number and sign-extends it into the 64-bit memory location (b in this case).
When assembling and running the code locally (using as and gdb), everything seems to work fine, but the address of arr is 0x402000, and not 0xDEADBEEF. So I tried running:

movq $0xDEADBEEF, b

but the assembly failed with:

Error: operand type mismatch for `movq'

which is confusing, as 0xDEADBEEF is 32-bit literal.
So my two questions are:

  1. Why does the above command not work (I assume it has something to do with the sign extension)?
  2. If the address of arr was 0xDEADBEEF, would the assembler fail as well?


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source