Wie kann gcc / clang annehmen, dass die Adresse einer String-Konstante 32-Bit ist?

Wenn ich dieses Programm kompiliere:

#include <stdio.h>

int main(int argc, char** argv) {
    printf("hello world!\n");
    return 0;
}

ei x86-64 verwendet die asm-Ausgabemovl $.LC0, %edi / call puts. Vollständige ASM-Ausgabe- / Kompilierungsoptionen auf Godbolt anzeigen.)

Meine Frage lautet: Woher weiß GCC, dass die Adresse des Strings in einen 32-Bit-Sofortoperanden passen kann? Warum muss es nicht @ verwendmovabs $.LC0, %rdi (d. h. einmov r64, imm64, keine Null oder vorzeichenerweitertesimm32).

AFAIK, nichts sagt, dass der Lader entscheiden muss, den Datenabschnitt an einer bestimmten Adresse zu laden. Wenn der String an einer Adresse oberhalb von @ gespeichert i1ULL << 32 dann werden die höheren Bits vom movl ignoriert. Ich habe ein ähnliches Verhalten mit Klirren, daher glaube ich nicht, dass dies nur bei GCC der Fall ist.

Der Grund, den ich interessiere, ist, dass ich mein eigenes Datensegment erstellen möchte, das an einer beliebigen von mir gewählten Adresse (möglicherweise über 2 ^ 32) im Speicher gespeichert ist.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage