Во-первых, почему ты это делаешь? Компилятор может делать квадратные корни сам. Вы просто вызываете правильную функцию математической библиотеки, включаете оптимизацию (чтобы она встроила стандартные функции), и я был бы удивлен, если бы она не выполняла то, что вы хотите. Результат - независимость от платформы (т. Е. Вы можете создать 64-битную, если хотите, или даже другую архитектуру), простой в обслуживании код - намного лучше!
Если вы настаиваете на том, чтобы сделать это трудным путем, gcc также может помочь здесь (я на самом деле не проверял это):
double asmSqrt(double x) {
__asm__ ("fsqrt" : "+t" (x));
return x;
}
Ограничение t
означает, что значение помещается в верхнюю часть стека с плавающей запятой - вам не нужно заботиться о том, как оно туда попадает. +
означает использование значения как для входа, так и для вывода.
Редактировать: О, и если вы делаете сами хотите внести изменения в регистры, вам лучше сообщить об этом компилятору в разделе 'clobbers', или вы можете перезаписать что-то, что он там хранил. 1012 *