Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 使用内存映射IO打印浮点值_Assembly_Mips_Mars Simulator - Fatal编程技术网

Assembly 使用内存映射IO打印浮点值

Assembly 使用内存映射IO打印浮点值,assembly,mips,mars-simulator,Assembly,Mips,Mars Simulator,我正在使用MIPS构建一个计算器,结果需要在浮点四舍五入到小数点后两位。 这是我的子程序,用于将任何内容打印到MIPS显示器中: mmOut: lui $t0, 0xffff mmOutLoop: lw $t1, 8($t0) andi $t1, $t1,0x0001 beq $t1, $zero, mmOutLoop sw $a0, 12($t0) //$a0 has the result I wish to print jr $ra

我正在使用MIPS构建一个计算器,结果需要在浮点四舍五入到小数点后两位。 这是我的子程序,用于将任何内容打印到MIPS显示器中:

mmOut:
lui $t0, 0xffff

mmOutLoop:  

lw      $t1, 8($t0)
andi    $t1, $t1,0x0001
beq     $t1, $zero, mmOutLoop
sw      $a0, 12($t0)    //$a0 has the result I wish to print
jr      $ra //return address of mmOut

目前,我正在将计算结果存储到堆栈中,然后将其转换为ASCII。如何使用浮点值实现相同的过程?

正如我所评论的,将结果写入内存映射I/O与浮点->字符串转换问题无关。这基本上是两个独立的步骤。对于按打印顺序生成结果的算法部分,如果需要,可以直接将结果发送到MMIO,而不是存储到内存中的字符串

根据代码中的循环,这可能会将计算时间与等待0xffff+8低位变为零的时间重叠,这显然意味着0xffff+12的MMIO寄存器准备接受另一个存储

相关:。不幸的是,我只回答了输入字符串->浮点部分

浮动->字符串可能更容易。您可能希望将其拆分为整数部分和小数部分

以浮点形式获取整数部分,以防它对于32位整数太大,可能被10的大幂除,直到它适合整数。然后可以转换为整数,并对该数字块使用快速整数转换。我想,如果你必须除以10^9或其他使之合适的东西,可以使用FP余数/模计算来获得整数部分的最低有效部分。可能需要10^9的多个除法才能将其精确到2^32

对于分数部分,请在asm中实现这一点:

print a '.'
while(frac != 0) {
    frac *= 10.0;
    double intpart = floor(frac);  // or trunc, frac should be non-negative
    frac -= intpart;
    store or print intpart (as a single ASCII decimal digit)
}
您可能想使用计数器来限制打印的位数,因为它可能是无限的.999999。。。或者别的什么,我想

如果您总是想打印.0而不是仅仅打印,请使用do{}while结构。当没有分数部分时

大多数FPU通过一条指令直接支持所有这些操作。我不熟悉MIPS的FPU指令,但我假设floor或trunc在硬件上至少可以通过转换为整数并返回来实现


你可以通过将frac乘以100或10000并使用更快的整数来加快计算速度。2位整数可以快速拆分。

使用火星模拟器,您可以使用。如v0=2打印浮动。但小数点后两位=>这是个问题。如果不写入100%正确的printf,最准确的简单解决方案可能是将结果乘以100.0,四舍五入为整数值,然后在最后2位之前插入“.”作为整数打印。这将大大减少结果的可用范围,最大值仅为int32_t/100=~21474836,可能会产生不完美的结果。或者编写自己的浮点值printf,这绝非小事,特别是如果您还试图使其快速且100%正确,则很容易需要几天/几周来实现它。顺便说一句,观看并了解固定输出设备如何使助手服务变得无用。如果您能够将打印服务的输出重定向到内存而不是控制台,您将能够使用打印浮点服务,然后将内存中生成的字符串调整为两位小数,并将其作为字符串打印到屏幕上。这将是比*100 int稍微多一点的代码,但是是全浮点。遗憾的是,你发布的代码对我来说没有多大意义,看起来它甚至可能以无限循环结束。因此,你有一个自旋循环,等待0xffff+8的低位变为零,然后将一个单词存储到0xffff+12。这与将整数或浮点转换为字符串的问题完全无关。是$a0还是单个ASCII字符?