Neznámé chybě symbolů, když se snaží MOV do proměnné, která je definována v kódu C nad montážní

hlasů
1

Snažím se spustit montáž kód uvnitř kódu C (na Clion). definované I proměnná X mimo montáž vložky a snažil se mov číslo do něj ale kompilátor říká, že x je definována. Nechápu, jak se dělá to vidět proměnné. Také musím použít syntaxi 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);
}


A tam je chyba

[ 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
...
Položena 13/02/2020 v 23:51
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
3

Vaším hlavním problémem je, že xje lokální proměnná. Budete muset použít rozšířena sestava jej upravit (a použít -masm=intelpouze syntaxi Intel):

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

Také můžete použít AT & T syntaxe. To bude vypadat takto:

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

Proto, že jsem s použitím =romezení zde, bude to uloženo v registru; Proto, nepotřebujete k použití eax(který by měl být ax, mimochodem) jako prostřední skladovací prostor pro uložení hodnoty.

Odpovězeno 14/02/2020 v 01:34
zdroj uživatelem

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