Udefinert symbolfeil ved mov inn variabel som definert i C-koden ovenfor sammenstilling

stemmer
1

Jeg prøver å kjøre assemblerkode inne C-kode (på Clion). I definert variabel x utsiden av monteringsinnsats og forsøkt å mov et nummer inn i den, men kompilatoren står x er udefinert. Jeg får ikke hvordan du gjør det se variabler. Også jeg må bruke intel syntaks.

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


Og det er feil

[ 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
...
Publisert på 13/02/2020 klokken 23:51
kilden bruker
På andre språk...                            


1 svar

stemmer
3

Din viktigste problemet er at xer en lokal variabel. Du må bruke utvidet forsamlingen til å endre det (og bruker -masm=inteltil å bruke Intel syntaks):

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

Du kan også bruke AT & T syntaks. Det vil se slik ut:

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

Fordi jeg bruker den =rbegrensningen her, vil dette bli lagret i et register; Derfor trenger du ikke å bruke eax(som bør være ax, forresten) som mellomlager sted å lagre verdien.

Svarte 14/02/2020 kl. 01:34
kilden bruker

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