Неопределенные символьные ошибки при попытке мов в переменный, которая определена в коде C выше сборок

голоса
1

Я пытаюсь запустить сборки кода C кода (на CLion). Я определил переменные х вне сборки вставки и попытался Mov числа в нем, но компилятор говорит й не определен. Я не понимаю, как сделать это увидеть переменные. Кроме того, я должен использовать синтаксис 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);
}


И есть ошибка

[ 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
...
Задан 13/02/2020 в 23:51
источник пользователем
На других языках...                            


1 ответов

голоса
3

Ваша главная проблема в том , что xлокальная переменная. Вы должны использовать расширенный узел , чтобы изменить его (и использовать -masm=intelиспользовать синтаксис Intel):

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

Кроме того, вы можете использовать AT & T синтаксис. Это будет выглядеть следующим образом:

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

Поскольку я использую =rограничение здесь, это будет храниться в регистре; Таким образом, вам не нужно использовать eax(что должно быть ax, кстати) в качестве промежуточного места хранения для хранения значения.

Ответил 14/02/2020 в 01:34
источник пользователем

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