2016-08-01 31 views
0

编写基于半径计算表面积的HLA汇编语言程序。示例程序对话如下所示。然而,你决定这么做,你的主程序应该包括调用一个程序或函数(至少一个...)来解决这个问题。输出中的HLA表面区域程序错误

我写我的代码,但得到 “####” 作为表面积 的输出继承人我的代码:

program surfaceArea; 
#include("stdlib.hhf"); 
static 
radius : real32; 

procedure computeSurfaceArea(r : real32); @nodisplay; @noframe; 
static 
returnAddress : dword; 
area : real32; 

begin computeSurfaceArea; 

pop(returnAddress); 
pop(r); 
push(returnAddress); 

finit(); 
fld(r); 
fld(st0); 
fmul(); 

fldpi(); 
fld(4.0); 
fmul(); 

fmul(); 

fstp(area); 
stdout.putr32(area, 4, 10); 
ret(); 
end computeSurfaceArea; 

begin surfaceArea; 

stdout.put("Lemme calculate the surface area of a sphere!", nl); 
stdout.put("Gimme r: "); 
stdin.get(radius); 
stdout.put("Surface area = "); 
call computeSurfaceArea; 

end surfaceArea; 
+1

我不知道hla(而且我永远不会有意识地修改x86程序集),但是:1)弹出返回地址并稍后推送它以获取参数非常难看。 2)除非'fmul()'解析为'fmulp',看起来你正在计算'4 * pi * pi'并在x87堆栈上留下东西3)圆的面积是'pi * r^2'。 4)看起来你正在调用'computeSurfaceArea'而没有它的参数。 –

+0

对不起,您正在计算球体的表面积,而不是圆的面积。没有看到。 –

回答

1

看吧: stdout.putr32(区,4,10) ;

不幸的是,您没有提供足够的字段宽度输出文本(前导数字的空间和小数)要正确打印的值。

stdout.putr32(r:real32; width:uns32; decpts:uns32); 这些过程的第一个参数是您希望打印的浮点值。该参数的大小必须与过程名称相匹配。第二个参数指定输出文本的字段宽度。与处理整数值时的宽度一样,此宽度是过程显示时所需的字符位置数。请记住包含数字符号和小数点的位置。第三个参数指定要在小数点后放置的打印位置的数量。 作为示例, stdout.putr32(pi,10,4); 显示值 _ _ _ _ 3.1416 下划线用于表示前导空格。

我希望这有助于!