LINUX.ORG.RU

gcc inline asm проблема


0

1

Есть отрывок кода с использованием asm-вставок:

asm(
	"mov %1,%%esi\n\t"
	"mov %2,%%eax\n\t"
	"mov $3,%%ebx\n\t"
	"mul %%ebx\n\t"
	"mov %3,%%ebx\n\t"
	"mul %%ebx\n\t"
	"add %1,%%eax\n\t"
	"mov %%eax,%%edi\n\t"
	"mov $0,%%eax\n\t"
	"mov %3,%%eax\n\t"
	"mov $2,%%ebx\n\t"
	"div %%ebx\n\t"
	"mov %%eax,%%ecx\n\t"
	"Cycle1:\n\t"
	"mov %2,%%eax\n\t"	
	"mov $3,%%ebx\n\t"
	"mul %%ebx\n\t"
	"mov %%eax,%%edx\n\t"
	"sub %%eax,%%edi\n\t"
	"Cycle2:\n\t"
	"sub $4,%%edx\n\t"
	"mov (%%edi,%%edx),%%eax\n\t"
	"mov (%%esi,%%edx),%%ebx\n\t"
	"mov %%eax,(%%esi,%%edx)\n\t"
	"mov %%ebx,(%%edi,%%edx)\n\t"
	"mov %%edx,%%eax\n\t"
	"jnz Cycle2\n\t"
	"mov %2,%%eax\n\t"
	"mov $3,%%ebx\n\t"
	"mul %%ebx\n\t"
	"add %%eax,%%esi\n\t"
	"loop Cycle1"	
	:
	:"g"(image), "g"(width), "g"(height)  
        :"memory"
	);

При компиляции с помощью gcc 4.4.3 выдает ошибку error: invalid 'asm': operand number out of range Вопрос: как это исправить? Весь интернет перерыл, но ответа пока так и не нашел. Заметил, что ошибка выводится только для последней объявленной переменной («g»(height) в данном случае), если та используется во вставке. И что если добавить пустую переменную к объявлению, которая нигде не используется, то ошибка исчезает. Однако, при запуске скомпилированной программы выдает ошибку сегментации. Буду благодарен за помощь.

Ответ на: комментарий от Kelheor

В программировании переменные нумеруются с нуля. У тебя не с нуля

ttnl ★★★★★ ()
Ответ на: комментарий от Kelheor

В статьях просто везде с 1 начиналось, думал 0 для чего-то другого зарезервирован..

Kelheor ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.