我刚刚开始在我的计算机科学课中学习汇编,并且我有一个使用指定的舍入模式舍入浮点值的赋值.我试图实现这种使用fstcw,fldcw和frndint.我修改舍入控制位,舍入数字,然后恢复先前的控制位(分配的要求).
当前突出的问题是指令fld %1似乎将错误的值加载到st(0)浮点寄存器中(例如,如果我调用值为2.6207的函数,则数字-1.9427(...)e-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;
}
Run Code Online (Sandbox Code Playgroud)
我很感激任何有关该代码错误的指示,特别是与fld %1线路和asm输入/输出有关的指针.(当然,如果你能找到其他问题,请随时告诉我他们.)我不希望任何人为我做功课,只是指出我正确的方向.谢谢!
| 归档时间: |
|
| 查看次数: |
3237 次 |
| 最近记录: |