【问题标题】:How to store a base 2 number in a register?如何将基数 2 存储在寄存器中?
【发布时间】:2019-05-22 12:07:12
【问题描述】:

但我的导师没有回应。我有一个 MIPS 计划的额外学分问题,如下所示:

Extra credit covers binary to ASCII data type conversion. It is useful 
to convert the 2’s complement integer into an ASCII string so that it
can be displayed on the monitor. Derive a binary-to-ASCII conversion
routine, BinarytoASCII, for converting a 2’s complement integer stored 
in a0 register into an ASCII string stored in v0 register. The value 
initially in a0 is restricted to be within the range -999 to +999. After   
the algorithm completes execution, v0 contains the sign of the value 
initially stored in a0. The following three bytes contain the three 
ASCII codes corresponding to the three decimal digits representing its
magnitude. This algorithm always produces a string of four characters 
independent of the sign and magnitude of the integer being converted.

也许我没有正确阅读这个问题,但是将二进制值直接存储到 MIPS 中的寄存器中不是不可能的吗?似乎这要求进行十进制到 ASCII 的转换。如果我错了,你能展示如何将一个基数为 2 的数字放入 MIPS 中的寄存器中吗?谢谢

【问题讨论】:

  • 你想多了——你认为以:)开头的寄存器中存储了什么(所有计算机都知道01)所以教授基本上希望你获取寄存器的内容并将其转换为一系列 ASCII '0''1'(例如 andshift 并添加,例如 or'0'...),然后反转字符串以恢复原始顺序)
  • 看看asciitable.com0x30'0'0x31'1'
  • @David,他希望将其转换为十进制,而不是二进制。 (但直到最后一句话的下一句才提到十进制。)
  • 啊,很好,所以添加手动 base2 到 base10 的转换,而不仅仅是 shift and add
  • 寄存器中的值已经以位编码(MIPS 寄存器在物理上是 32 位(0 或 1)并且 nothing 其他)。当调试器显示a0 包含1234 时,它采用原始的32 位模式,并将其解释为整数(即​​它转换为字符串),并在屏幕上显示,但寄存器仍然只是位模式...(即如果 1234 是十六进制,那么寄存器在顶部包含 16 个零位,然后是 0001_0010_0011_0100 ...如果是十进制,我懒得将 base10 1234 转换为 base2 ...无论如何,你希望现在就明白了)。

标签: assembly binary ascii mips mars-simulator


【解决方案1】:

寄存器中的数字是二进制的。这就是为什么 32 位寄存器可以使用 2 的补码编码存储来自-2^31 .. 2^31-1 的有符号值。 https://en.wikipedia.org/wiki/Two%27s_complement

如果寄存器中的原生存储格式是十进制,则左移和右移将乘/除以 10 的幂,而不是 2 的幂。


编码与值是分开的。给定 32 位寄存器中的0b11111111111111111111110000011001 位模式,您可以将编码值描述/表示为

  • -999 十进制,将其解释为有符号 2 的补码
  • 0xfffffc19无符号十六进制
  • 037777776031八进制
  • 0b11111111111111111111110000011001二进制

这些都是相同的数字,只是表示数学值(作为负十进制数)或 2 的补码位模式(十六进制、八进制和二进制)的不同方式。

通常十六进制仅用于描述位模式,因此您通常不会看到像 -0x3e7 这样的负十六进制数。


寄存器或内存中的数字是“十六进制”是一个常见的误解。 Hex 是二进制数的序列化格式,允许它们以人类可读格式存储为文本。一个数字只有在存储为 ASCII 字符序列时才为十六进制。

十进制数字的 ASCII 字符串是序列化数字的另一种方式,这就是您在此处被要求执行的操作。

asm 源代码中通常使用十六进制和十进制,但汇编器会将您的数字组装成 32 位二进制字。 (或者 16 位立即数作为指令流的一部分,例如 addiu $t0, $t1, 0x1234

您可以使用十六进制来讨论二进制数的值,但它实际上是以 2 位为基数存储的。

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 2023-03-10
    • 2015-10-25
    • 2016-01-18
    • 2012-03-23
    • 2018-07-13
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多