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

284
15 декабря 2016, 16:09

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

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

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

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

leal $table, %ebx

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

lea ebx, offset table

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

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

READ ALSO
-1.#IND  без деления на 0

-1.#IND без деления на 0

Прочитал, что такая ошибка при делении на ноль, но у меня нет никакого деления, самая простая программа:

267
Как вызвать функцию из строки?

Как вызвать функцию из строки?

Есть много функций с одинаковым именем и разной цифрой в конце этого имени, то есть function1, function2, function3 и тд

229
Перегрузка метода абстрактного класса

Перегрузка метода абстрактного класса

Не знаю правильно ли я назвал вопрос, но ситуация такаяЕсть класс Parent:

219
МНК алгоритм

МНК алгоритм

Метод наименьших квадратов

215