Undefinierte Symbolfehler, wenn sie in variable mov versucht, die oben in C-Code definiert Montage

stimmen
1

Ich versuche, Assembler-Code innerhalb von C-Code auszuführen (auf CLION). I definierte Variable x außerhalb des Montageeinsatzes und versucht, eine Anzahl, in sie aber mov Compiler sagt x undefiniert ist. Ich verstehe nicht, wie es Variablen sehen zu machen. Auch muss ich Intel-Syntax verwenden.

int main(int argc, char** argv) {
short int x = 0;
__asm__ (
.intel_syntax noprefix\n\t
mov eax, 0x02\n\t
mov x, eax\n\t
.att_syntax prefix\n\t
);
printf(%d, x);
}


Und es gibt Fehler

[ 50%] Building CXX object CMakeFiles/ass_lab_2.dir/main.cpp.o
[100%] Linking CXX executable ass_lab_2
/usr/bin/ld: CMakeFiles/ass_lab_2.dir/main.cpp.o: relocation R_X86_64_32S against undefined symbol `x' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
...
Veröffentlicht am 13/02/2020 um 21:51
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
3

Ihr Hauptproblem ist , dass xist eine lokale Variable. Sie müssen verwenden Baugruppe erweitert , ihn zu ändern (und verwenden -masm=intelIntel - Syntax zu verwenden):

int main(void)
{
    short int x = 0;
    __asm__("mov %0, 0x02\n\t" : "=r"(x));
    printf("%d", x);
}

Auch können Sie auf AT & T-Syntax verwenden. Es wird wie folgt aussehen:

int main(void)
{
    short int x = 0;
    __asm__("mov $0x02, %0\n\t" : "=r"(x));
    printf("%d", x);
}

Weil ich die bin mit =rZwang hier, wird dies in einem Register gespeichert werden; Daher müssen Sie nicht verwenden müssen eax(was sein sollte ax, nebenbei bemerkt ) als Zwischenspeicher Ort , um den Wert zu speichern.

Beantwortet am 13/02/2020 um 23:34
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more