PythonistGit
@PythonistGit
Програміст-самоучка

Что за ошибка в коде вложенного ассемблера?

Я работаю на виртуалке, в убунту. Начал работать в gcc. Взял ассемблер, и пробовал сделать прибавитель. Но что-то пошло не так.

Код:
#include <iostream>
#include <stdio.h>
using namespace std;

int main(int argc, char** argv)
{
	int a, b, c;
	cin >> a;
	cin >> b;
	
	asm (
		"mov a, %eax \n\t"
		"mov b, %ebx \n\t"
		"add %eax, %ebx \n\t"
		"mov %ebx, c \n\t"
	);

	printf("%d", c);
	return 0;
}


Компилирую, а тут фигня происходит:
pythonistgit@pythonistgit-VirtualBox:~/Документи$ g++ -C -o test test.cpp
/usr/bin/ld: /tmp/cccT2YRx.o: relocation R_X86_64_32S against невизначений символ `a' can not be used when making a PIE object; виконайте повторне збирання з -fPIC
/usr/bin/ld: спроба остаточного компонування зазнала невдачі: Розділ, непридатний для виведення даних
collect2: error: ld returned 1 exit status


Кто-нибудь может объяснить в чем дело?
  • Вопрос задан
  • 157 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
asm (
    "mov a, %eax \n\t"
    "mov b, %ebx \n\t"
    "add %eax, %ebx \n\t"
    "mov %ebx, c \n\t"
  );


Так в gcc не работает. Должно быть например так:
asm (
    "mov %[a], %%eax \n\t"
    "mov %[b], %%ebx \n\t"
    "add %%eax, %%ebx \n\t"
    "mov %ebx, %[c] \n\t"
    : [c] "=rm" (c)
    : [a] "rm" (a), [b] "rm" (b)
    : "eax", "ebx", "cc"
  );

Что это всё значит можно почитать тут.

Компилирую, а тут фигня происходит:

Ошибка говорит о том, что код попытался обратиться к глобальному символу a, но такого символа нет. Потому что переменная a размещена на стеке и символьного имени у неё и правда нет. Если бы она (вместе с b и c) была глобальной, всё равно была бы ошибка (по крайней мере при компиляции под 64 бита), но другая.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы