Ассемблеровская вставка в с++ , не пойму в чем данная ошибка: - Вопросы по С+
  • Чаты 4chT.com в телеграмм
    Наши группы в телеграмм

Вопрос Ассемблеровская вставка в с++ , не пойму в чем данная ошибка:

Регистрация
10 Дек 2013
Сообщения
78
Репутация
0
Спасибо
0
Монет
0
С2415 недопустимый тип операнда.
Вроде бы обнулил (xor edi, edi ), а при сравнении (cmp) всё равно пишет ошибку
Код:
#include
#include

using namespace std;

int main()
{
int mass[10] = { 15, 10, 22, 360, 76, 2, 88, 115, 9, 3 };
int left, right;
int t;
int count = 10;
left = 0;
right = count - 1;
_asm
{
pushad
mov esi, 1
mov ebx, left
mov eax, right
cycle1 :
cmp ebx, eax
ja exit
cmp esi, 0
jb exit
xor esi, esi
mov ecx, eax
xor edi,edi // edi = 0
cycle2 :
inc edi
usl :
cmp mass[edi * 4], mass[edi * 4 + 4]
jb out_cycle
xchg mass[edi * 4], mass[edi * 4 + 4]
mov edi, 1
out_cycle : loop cycle2

dec eax
xor ecx, ecx
mov ecx, eax
cycle3 :
cmp mass[ecx * 4 - 4], mass[ecx * 4]
jb out_usl1
xchg mass[ecx * 4 - 4], mass[ecx * 4]
mov edi, 1
out_usl1 :
loop cycle3
inc ebx
exit : popad

}
cout << "Mass:" << mass << " ";
}
 
Регистрация
17 Июн 2013
Сообщения
91
Репутация
0
Спасибо
0
Монет
0
Это чель cmp mass[ecx * 4 - 4], mass[ecx * 4] Вот представь, для процессора то, что в памяти просто нет. Это ему нажно получить: значит он грузить должен из памяти куда-то... но ладно на шину свою, но ты ему снова другую ячейку суешь для сравнения. Значит хочешь или не хочешь, у такого процессора должно быть две шины данных и две адреса.... сложно, не знаю такого. А так обычно указывают регистра и память для сравнения. Так что загони в начале в регистр, потом с памятью сравнивай.
 
Регистрация
8 Дек 2013
Сообщения
75
Репутация
0
Спасибо
0
Монет
0
cmp mass[edi * 4], mass[edi * 4 + 4] ... xchg mass[edi * 4], mass[edi * 4 + 4] ... cmp mass[ecx * 4 - 4], mass[ecx * 4] ... xchg mass[ecx * 4 - 4], mass[ecx * 4] CISC архитектуры не умеют работать с двумя адресами памяти одновременно напрямую, тебе нужно раскидать по регистрам
 
Сверху Снизу