Nieokreślone symbol błędu podczas próby mov do zmiennej, które zdefiniowano powyżej, w kod C. Zespół

głosy
1

Próbuję uruchomić kod montaż wewnątrz kodu C (na Clion). I zdefiniowano zmienną x poza montaż wkładki i próbował mov numer do niego, ale kompilator mówi x jest niezdefiniowana. Nie rozumiem, jak uczynić go zobaczyć zmienne. Również muszę używać składni Intela.

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);
}


I nie ma błędów

[ 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
...
Utwórz 13/02/2020 o 21:51
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
3

Twoim głównym problemem jest to, że xjest to zmienna lokalna. Będziesz musiał użyć rozszerzony montaż zmodyfikować go (i używać -masm=intelużywać składni Intel):

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

Ponadto, można użyć składni AT & T. Będzie to wyglądać tak:

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

Ponieważ używam =rograniczenie tutaj, to będą przechowywane w rejestrze; Dlatego nie ma potrzeby stosowania eax(która powinna być ax, przy okazji) jako pośredni miejsca przechowywania do przechowywania wartości.

Odpowiedział 13/02/2020 o 23:34
źródło użytkownik

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