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


Кто-нибудь может объяснить в чем дело?
  • Вопрос задан
  • 146 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
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 бита), но другая.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Aquarius Москва
от 150 000 ₽
VMS Software Санкт-Петербург
от 110 000 ₽
Wärtsilä Digital Technologies Санкт-Петербург
До 180 000 ₽
15 авг. 2020, в 10:49
800 руб./в час
15 авг. 2020, в 05:42
50000 руб./за проект
15 авг. 2020, в 05:23
5000 руб./за проект