Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Psilon
Master of Orion
Эксперт .NET
6021 / 4873 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
1

Ошибка ассемблерной вставки "too many memory references for 'add'"

30.09.2012, 02:37. Просмотров 1860. Ответов 12
Метки нет (Все метки)

Собственно сабж. Не могу понять, в чем дело
C
1
2
3
4
5
6
void k(void)
{
    unsigned a = 1;
    unsigned register result = 2;
    asm("add result , a");
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2012, 02:37
Ответы с готовыми решениями:

Функция замены ":" на "_" в названии файла и ошибка "undefined reference to 'strcat'"
Добрый день,прошу помочь мне с такой проблемой: В общем есть функция,работающая с именем...

Создать запись "Двигатель", которая содержит элементы "Название", "Мощность", "Скорость", "Цена"
Создать запись "Двигатель", которая содержит элементы "Название", "Мощность", "Скорость",...

Сортировка подсчетом и ошибка "Невозможно преобразовать "void*" в "int*"
Мне нужно отсортировать одномерный массив с помощью алгоритма сортировки, однако возникает ошибка...

Ошибка сборки "unresolved external symbol" при использовании ассемблерной вставки
Помогите пожалуйста исправить 2 ошибки. Очень долго мучаюсь Error LNK2019 unresolved external...

Запрос "alter table Таблица1 add column ". Ошибка: "Слишком большая длина записи"
При выполнении запроса выпадает ошибка "Слишком большая длина записи" Private Sub...

12
Kastaneda
Jesus loves me
Эксперт С++
5020 / 3033 / 348
Регистрация: 12.12.2009
Сообщений: 7,646
Записей в блоге: 2
Завершенные тесты: 1
30.09.2012, 06:35 2
Какой компилятор? У каждого компилятора свой синтаксис встроенного ассемблера.
0
MansMI
1450 / 1159 / 550
Регистрация: 08.01.2012
Сообщений: 4,509
30.09.2012, 08:44 3
здается мне, оно говорит: память на память работать не могу, т.е классика
0
Psilon
Master of Orion
Эксперт .NET
6021 / 4873 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
30.09.2012, 09:49  [ТС] 4
Работаю на Qt
здается мне, оно говорит: память на память работать не могу, т.е классика
т.е.? У нас асма совсем немного было, я знаю только синтаксис и правила работы со стеком, ну и небольшие особенности 8086...
0
MansMI
1450 / 1159 / 550
Регистрация: 08.01.2012
Сообщений: 4,509
30.09.2012, 10:02 5
первый раз вижу такую вставку, но асм память на память не работает, нужно промежуточно исользовать регистр, что-то вроде:
Assembler
1
2
3
mov ax,result
add ax,a
mov result,ax
1
Psilon
Master of Orion
Эксперт .NET
6021 / 4873 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
30.09.2012, 10:17  [ТС] 6
MansMI, спс, че-то туплю ночью

Добавлено через 10 минут
Та же ошибка с
C
1
2
asm("mov eax,a");
asm("mov ebx,b");
Добавлено через 2 минуты
Полный код выглядит так(в теории)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void fib(unsigned n, int printSequence)
{
    int i;
    unsigned a = 1, b = 1, temp;
    if (n<0) return;
    if (printSequence)
        printf("%d %d ",a,b);
    for (i = 1; i < n; i++)
    {
        //temp = a;
       // a += b;
        //b = temp;
        asm("mov eax, a");
        asm("mov ebx, b");
        asm("mov eac, ecx");
        asm("add eax, ebx");
        asm("mov a, eax");
        asm("mov b, ecx");
 
        if (printSequence)
            printf("%d ",a);
    }
    if (!printSequence)
        printf("%d ",a);
}
0
MansMI
1450 / 1159 / 550
Регистрация: 08.01.2012
Сообщений: 4,509
30.09.2012, 10:34 7
ну а обычная вставка, не работает?
Assembler
1
2
3
4
5
_asm
{
    mov eax,a
    ..........
}
кстати , стр.15 "eac" что такое?
0
Psilon
Master of Orion
Эксперт .NET
6021 / 4873 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
30.09.2012, 15:40  [ТС] 8
MansMI, очепятка, "mov ecx, eax" там, просто 'x' и 'c' рядом.
По поводу вашего варианта:
main.c:45: ошибка: '_asm' undeclared (first use in this function)
Добавлено через 9 минут
Тут нашел похожую ситуацию, но не пойму
http://stackoverflow.com/questions/7...rences-for-mov

Добавлено через 3 минуты
Там написанно:
So it should be:

mov %eax,0
mov %ebx,x
mov %edx,y
Но после этого у меня эта ошибка просто заменяется другой: код становится таким:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void fib(unsigned n, int printSequence)
{
    int i;
    unsigned a = 1, b = 1, temp;
    if (n<0) return;
    if (printSequence)
        printf("%d %d ",a,b);
    for (i = 1; i < n; i++)
    {
        //temp = a;
       // a += b;
        //b = temp;
        asm("mov %eax, a");
        asm("mov %ebx, b");
        asm("mov %ecx, %eax");
        asm("add %eax, %ebx");
        asm("mov a, %eax");
        asm("mov b, %ecx");
        if (printSequence)
            printf("%d ",a);
    }
    if (!printSequence)
        printf("%d ",a);
}
main.c:38: ошибка: undefined reference to `a'
main.c:39: ошибка: undefined reference to `b'

Если заменить a и b на 0 в последнем варианте, то все компилируется.
Фактически я хочу на асме переписать закомментированную часть.
0
MansMI
1450 / 1159 / 550
Регистрация: 08.01.2012
Сообщений: 4,509
30.09.2012, 16:12 9
возможно: т.к a и b являются цифрами в hex, могут возникнуть непонятки, попробовать идентификаторы изменить ... бубен одним словом
0
Kastaneda
Jesus loves me
Эксперт С++
5020 / 3033 / 348
Регистрация: 12.12.2009
Сообщений: 7,646
Записей в блоге: 2
Завершенные тесты: 1
30.09.2012, 17:24 10
Еще раз
Цитата Сообщение от Kastaneda Посмотреть сообщение
Какой компилятор? У каждого компилятора свой синтаксис встроенного ассемблера.
0
Psilon
Master of Orion
Эксперт .NET
6021 / 4873 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
30.09.2012, 17:34  [ТС] 11
Kastaneda, Еще раз
Работаю на Qt
Добавлено через 1 минуту
MansMI, нет, не в именовании дело, x и y точно также не хочет
0
Kastaneda
Jesus loves me
Эксперт С++
5020 / 3033 / 348
Регистрация: 12.12.2009
Сообщений: 7,646
Записей в блоге: 2
Завершенные тесты: 1
30.09.2012, 18:20 12
Цитата Сообщение от Psilon Посмотреть сообщение
Kastaneda, Еще раз
Сори, не увидел.
Тогда я так понимаю у тебя компилятор MinGW, он использует синтаксис AT&T (это где знаки процента писать надо) и у него обратный порядок операндов. Т.е. в синтаксисе Intel
Assembler
1
mov eax, ebx
означает, что ebx запишется в eax, а в AT&T эта же строка будет выглядеть так
Assembler
1
mov %ebx, %eax
И во встроеном ассемблере gcc (MinGW) имена сишных переменных просто так нельзя использовать, там это делается по другому. Можешь почитать здесь.
1
Psilon
Master of Orion
Эксперт .NET
6021 / 4873 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
30.09.2012, 21:44  [ТС] 13
Kastaneda, нашел такой вот пример:
C
1
asm ( "add %1, %0" : "=r" (sum) : "r" (x), "0" (y) ); // sum = x + y;
пытаюсь написать что-то похожее (потому что плохо вообще понимаю, что это значит)
C
1
asm("movl %1, %eax" : : "1" (y));
Естественно, ошибка
main.c:38: ошибка: matching constraint references invalid operand number
Добавлено через 3 минуты
Не знаю, может вы подскажете. У меня есть
C
1
unsigned a = 1, b = 1;
Мне надо:
1) Загрузить a в регистр %eax;
2) Сложить %eax и b, результат сохранить в a; // Как в примере выше
3) Загрузить %eax в b;

Добавлено через 2 минуты
Еще вот такую штуку нашел, пока читаю
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s3

Добавлено через 2 минуты
Вот:
C
1
2
3
4
5
6
7
        int a=10, b;
        asm ("movl %1, %%eax; 
              movl %%eax, %0;"
             :"=r"(b)        /* output */
             :"r"(a)         /* input */
             :"%eax"         /* clobbered register */
             );
Поясните, пожалуйста, а то вообще не понимаю синтаксиса
0
30.09.2012, 21:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2012, 21:44

Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add")
При использовании следующего кода: Word = CreateOleObject(&quot;Word.Application.8&quot;);...

Ошибка "Could not find source location to add method <...> "END." or INITIALIZATION not found in unit source"
Помогите пожалуйста какого значение ошибки Could not find source location to add method...

Ошибка "Link all references for a local rename"
Я совсем ламмер в Джаве, только что начал изучать и решил написать квадратное уравнение. Вот мой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru