inline assembler, how to load the address of a variable

Using the inline assembler, I want to access some program data (myArray).
It should be quite simple, but I did not find a solution.
This is my "Minimal, Complete, and Verifiable example":

#define DEBUG

const byte dummy1[1000] PROGMEM = {};
const byte myArray[64] PROGMEM = {};
const byte dummy2[151] PROGMEM = {};

void setup() {
#ifdef DEBUG
  Serial.begin(9600);
  Serial.println( (int) &dummy1, HEX);
  Serial.println( (int) &myArray, HEX);
  Serial.println( (int) &dummy2, HEX);
#endif
  asm(
    "ldi r26, %A0 \n"  
    "ldi r27, %B0 \n" 
    : :
    "m" (myArray)
    :
  );
}

void loop() {}

While %A0 should return the low byte and %B0 the second byte, this does not work here.
Actually, the code compiles (Atmega328, IDE 1.8.6), but both r26 and r27 will be loaded with the low byte of the array address.
When investigating I had to learn the compiler arranges dummy2 first, then myArray, then dummy2 in memory. (The size of dummy1 does not matter.) When I increase the size of dummy2 the start of myArray will be beyond 0xFF, and the compiler will show an error message:
relocation truncated to fit: R_AVR_LDI against `no symbol'
(If DEBUG is undefined, the limit shifts a little.)
Trying with low, high, pm_lo8, pm_hi8 and other letters for the constraint did not help.
As long as dummy2 is small, I could load r27 with zero, but that is no reliable solution.
And please: do not tell me not to use assembler ...

I'm not sure how to do it cleanly your way, but you could instead just load the registers directly with a constraint, eg.:

  asm(
    "nop \n\t" 
    : :
    "x" (myArray)
    :
  );