Indefinido error de símbolo cuando se trata de mov en la variable que se define en el código C por encima de ensamblaje

votos
1

Estoy tratando de ejecutar el montaje código dentro de código C (en CLION). He definido la variable x fuera del conjunto de inserción y trató a mov un número en él, pero el compilador dice x no está definido. No entiendo cómo hacer que ver variables. También tengo que usar la sintaxis de Intel.

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


Y hay un error

[ 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
...
Publicado el 13/02/2020 a las 23:51
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
3

Su principal problema es que xes una variable local. Usted tendrá que utilizar extendida de montaje para modificarlo (y usar -masm=intela usar la sintaxis de Intel):

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

Además, puede utilizar la sintaxis de AT & T. Se parece a esto:

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

Porque estoy usando la =rlimitación aquí, esto va a ser almacenado en un registro; por lo tanto, no es necesario para el uso eax(que debería ser ax, por cierto) como un lugar de almacenamiento intermedio para almacenar el valor.

Respondida el 14/02/2020 a las 01:34
fuente por usuario

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