Нужно с использованием оператора LEA узнать адрес начала списка символов, чтобы потом с помощью XLAT выбрать нужный символ. С обычной переменной LEA работает, но вот в случае списка ассемблер ругается:
undefined reference to `table'
Код:
using namespace std;
short a,b,c;
int main (int argc, char** argv) {
char C, *table;
short d;
table = new char [16];
C='0';
for (int i=0;i<=9;i++)
{
table[i]=C;
cout<<table[i]<<endl;
C++;
}
C='A';
for (int i=10;i<=15;i++)
{
table[i]=C;
cout<<table[i]<<endl;
C++;
}
__asm__ ("movb $13, %al\n"
"lea $table, %ebx\n"
"xlat\n"
"movb %al, c\n"
);
cout << "c= " << table << endl;
return 0;
}
Перед командой xlat в регистр ebx нужно положить адрес таблицы, вы же пытаетесь положить туда адрес переменной-указателя на таблицу.
Вместо lea нужно использовать команду movl foo, %ebx, тогда в ebx окажется значение переменной (адрес таблицы).
В вашем случае программа отказывается компилироваться, т.к. запись
leal $table, %ebx
эквивалентна в синтаксисе intel следующей записи:
lea ebx, offset table
Такой тип операнда-источника lea не поддерживает.
Программа скомпилируется, если перед table убрать доллар, но результат будет неправильный, т.к., как уже было сказано, в ebx окажется адрес переменной-указателя, а не её значение.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости