我剛開始學習彙編在我的計算機科學類,我使用指定的舍入模式有一個分配給圓一個浮點值。我試圖用fstcw
,fldcw
和frndint
來實現這個功能。我修改舍入控制位,在數字的四捨五入,然後恢復先前的控制位(賦值的一個要求)。與內聯彙編雙精度數(GCC,IA-32)工作
當前突出的問題是,指令fld %1
似乎加載錯誤的值到st(0)
浮點寄存器(例如,如果我叫用2.6207值的函數,數-1.9427(...)電子29被裝入寄存器)。這可能是由於gcc
的內嵌asm()
或別的東西被誤用,但我不確定它爲什麼會發生。
這是我有:
double roundD (double n, RoundingMode roundingMode)
{
// control word storage (2 bytes for previous, 2 for current)
char *cw = malloc(4*sizeof(char));
char *cw2 = cw + 2;
asm("fstcw %3;" // store control word in cw
"mov %3,%4;" // copy control word into cw2
"and $0xF3FF,%4;" // zero out rounding control bits
"or %2,%4;" // put new mode into rounding control bits
"fldcw %5;" // load the modified control word
"fld %1;" // load n into st(0)
"frndint;" // round n
"fstp %0;" // load st(0) back into n
"fldcw %3;" // load the old control word from cw
: "=m" (n)
: "m" (n), "m" (roundingMode),
"m" (cw), "r" (cw2), "m" (cw2) // mov requires one argument in a register
);
free(cw);
return n;
}
我會很感激任何指針什麼是錯的代碼,具體涉及到fld %1
線和asm
輸入/輸出。 (當然,如果你能找到其他問題,也可以隨時讓我知道他們。)我不希望任何人爲我做功課,只是指出我的方向。謝謝!
哇,那真是太棒了。希望我能幫忙,但是我做不到! :) – 2010-02-12 05:51:42
你能告訴我們這個函數的彙編輸出嗎?並且如果代碼字節不是太麻煩的話。 – 2010-02-12 06:42:39
@John:它將被組裝的代碼並不令人意外;這一切都在一個巨大的不透明(對海灣合作委員會)asm塊。 :-P然而,將它分解成許多小的彙編語句(比如我的文章)會讓gcc有更多的自由去做一些不同的事情。 – 2010-02-12 06:49:05