Как узнать адрес начала массива в ассемблере?

Рейтинг: 0Ответов: 1Опубликовано: 14.12.2014

Нужно с использованием оператора 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;

}

Ответы

▲ 3

Перед командой xlat в регистр ebx нужно положить адрес таблицы, вы же пытаетесь положить туда адрес переменной-указателя на таблицу.

Вместо lea нужно использовать команду movl foo, %ebx, тогда в ebx окажется значение переменной (адрес таблицы).

В вашем случае программа отказывается компилироваться, т.к. запись

leal $table, %ebx

эквивалентна в синтаксисе intel следующей записи:

lea ebx, offset table

Такой тип операнда-источника lea не поддерживает.

Программа скомпилируется, если перед table убрать доллар, но результат будет неправильный, т.к., как уже было сказано, в ebx окажется адрес переменной-указателя, а не её значение.