#include <stdio.h>
#include <stdlib.h>
unsigned sadd32(unsigned a, unsigned b)
{
unsigned c = 0;
__asm__ ("movl %2, %%eax\n\t"
"addl %1, %%eax\n\t"
"movl %%eax, %0\n\t"
:"=r"(c)
:"r"(a),"r"(b)
:"%eax"
);
return c;
}
int main()
{
unsigned int a=3,b=5;
printf("The sum of %u and %u is %u\n",a,b,sadd32(a,b));
return 0;
}
Ссылаясь на: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
Из того, что я вижу, что ваш код имеет некоторые недостатки ::
unsigned sadd32(unsigned a, unsigned b)
{
unsigned c = 0;
__asm__("movl %%eax, %0" : "=a"(a));
__asm__("addl %%eax, %0" : "=b"(b));
__asm__("movl %edx, 0xffffffff"); /* this here, you are specifying a manual location, may not be accessible or valid */
__asm__("cmovc %eax, %edx"); /* resulting in its error */
__asm__("movl %0, %%eax" : "=c"(c));
return c;
}
Кроме того, я что вы не поняли концепцию «= $». Из того, что я вижу, вы просто пишете имя переменной там, но это не так, как это работает. С сайта, ограничение ограничения (как они известны), заключаются в следующем:
- «м»: операнд памяти разрешено, с любым видом адреса, что машина поддерживает в целом.
- «o»: операнд памяти разрешен, но , только если адрес смещен. т.е. добавление небольшого смещения к адресу дает действительный адрес.
- «V»: операнд памяти, который не является офсетным. Другими словами, все, что соответствует
m’ constraint but not the
o'constraint.
- «i»: Непосредственное целое число допускается операнд (один с постоянным значением). Это включает в себя символические константы , значения которых будут известны только во время сборки.
- "n": Допускается немедленный целочисленный операнд с известным числовым значением. Многие системы не могут поддерживать константы времени сборки для операндов менее одного слова. Ограничения для этих операндов должны использовать 'n' , а не 'i'.
- «g»: Любой регистр, память или мгновенное целое число допускается операнд, за исключением регистров, которые не являются общими регистрами.
Обратитесь к сайту за дополнительными примерами и другими ограничениями. Надеюсь, это помогло! :)
Похоже, у вас неправильный порядок операндов. Это должно быть 'source, dest' в синтаксисе AT & T. Плюс немедленные операнды (например, 0xffffffff) должны иметь префикс '$'. Могут быть и другие проблемы. – Michael
Я думаю, что важным моментом является использование одного блока '__asm__', а не нескольких. Это гарантирует, что компилятор не вставляет код сборки между вашими линиями (он может добавить некоторые перед блоком, но это нормально). – ugoren